/*
 * Copyright (c) Huawei Device Co., Ltd. 2024-2025. All rights reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { BusinessError, commonEventManager, power } from '@kit.BasicServicesKit';
import { LogDomain, LogHelper } from '@ohos/basicutils/src/main/ets/TsIndex';
import { AbstractObserverManager } from '../base/AbstractObserverManager';

const TAG = 'PowerSaveModeManager';
const log = LogHelper.getLogHelper(LogDomain.KG, TAG);

/**
 * powerMode 系统显示变化监听
 */
export interface PowerSaveModeListener {

  /**
   * powerMode变化监听
   *
   * @param powerMode mode类型
   */
  onPowerSaveModeChange: (powerMode: number) => void;
}

/**
 *
 * PowerSaveMode change 管理
 *
 */
export class PowerSaveModeManager extends AbstractObserverManager<PowerSaveModeListener> {
  public static instance: PowerSaveModeManager | undefined = undefined;
  private _powerMode: number = -1;
  private mPowerSaveSubscriber: commonEventManager.CommonEventSubscriber | null = null;
  private powerSaveSubscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
    events: [
      commonEventManager.Support.COMMON_EVENT_POWER_SAVE_MODE_CHANGED
    ]
  };

  /*
   * 获取powerMode变化实例
   *
   * @param PowerSaveModeManager
   * */
  public static getInstance(): PowerSaveModeManager {
    if (PowerSaveModeManager.instance === undefined) {
      log.showInfo(`getInstance new instance`);
      PowerSaveModeManager.instance = new PowerSaveModeManager();
    }
    return PowerSaveModeManager.instance;
  }

  /**
   * 注册观察者
   *
   * @param observer 观察者
   * @param isCallbackImmediately 是否注册时立即回调
   */
  public registerObserver(observer: PowerSaveModeListener, isCallbackImmediately: boolean = false,
    highPriory: boolean = true): void {
    super.registerObserver(observer, isCallbackImmediately, highPriory);
  }

  /*
   * 初始化powerMode变化监听
   * */
  protected doInit(): void {
    log.showInfo(`doInit`);
    this.mPowerSaveSubscriber = commonEventManager.createSubscriberSync(this.powerSaveSubscribeInfo);
    commonEventManager.subscribe(this.mPowerSaveSubscriber,
      (err: BusinessError, data: commonEventManager.CommonEventData): void => {
        if (err) {
          log.showError(`Can't handle common event, err: ${err.code}, err: ${err.message}`);
          return;
        }
        this.handlePowerModeChangeEvent(data);
      });
  }

  private handlePowerModeChangeEvent(data: commonEventManager.CommonEventData): void {
    log.showInfo(`Received power save mode change notification, curPowerMode: ${data.code}`);
    if (this._powerMode === data?.code) {
      return;
    }
    this._powerMode = data?.code ?? -1;
    this.broadcastDataChange(observer => {
      observer.onPowerSaveModeChange(this._powerMode);
    });
  }

  /*
   * 去初始化事件监听
   * */
  protected doRelease(): void {
    log.showInfo(`unInitPolicy`);
    try {
      commonEventManager.unsubscribe(this.mPowerSaveSubscriber, (err) => {
        if (err) {
          log.showError(`unInitPolicy unsubscribe fail1 ,error is ${err.message}`);
          return;
        }
        this.mPowerSaveSubscriber = null;
      });
    } catch (err) {
      log.showError(`unInitPolicy,unsubscribe fail2,error is ${err.message}`);
    }
  }
}