/*
 * 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 { LogDomain, LogHelper } from '@ohos/basicutils';
import { SCBSceneSessionManager } from '@ohos/windowscene';
import { GlobalStatusCache, StatusCacheConst } from '../base/GlobalStatusCache';
import { SlStorageKey } from '../constants/SlStorageKey';
import { ScreenLockStateManager } from '../manager/ScreenLockStateManager';
import { SimCardStateManager } from '../manager/SimCardStateManager';
import { LockUnlockCallback, ScreenLockUnlockService } from '../services/ScreenLockUnLockService';
import { SystemSwitchUtils } from '../utils/SystemSwitchUtils';
import type { Callback } from '@ohos.base';

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

/**
 * 锁屏接口,仅供内部模块使用
 */
export class ScreenLockApi {
  private static getLockCallback: Function | undefined;
  private static requestUnlockCallback: Function | undefined;
  private static unlockWhenNoPswCallback: Function | undefined;
  private static notifyUnlockTransitionCallback: Function | undefined;
  private static isScreenLockShowCallback: Function | undefined;
  private static isDeviceLockedCallback: Function | undefined;

  public static initCallback(getLockCallback: Function, requestUnlockCallback: Function,
    unlockWhenNoPswCallback: Function, notifyUnlockTransitionCallback: Function,
    isScreenLockShowCallback: Function, isDeviceLockedCallback: Function): void {
    ScreenLockApi.getLockCallback = getLockCallback;
    ScreenLockApi.requestUnlockCallback = requestUnlockCallback;
    ScreenLockApi.unlockWhenNoPswCallback = unlockWhenNoPswCallback;
    ScreenLockApi.notifyUnlockTransitionCallback = notifyUnlockTransitionCallback;
    ScreenLockApi.isScreenLockShowCallback = isScreenLockShowCallback;
    ScreenLockApi.isDeviceLockedCallback = isDeviceLockedCallback;
  }

  public static clearCallback(): void {
    ScreenLockApi.getLockCallback = undefined;
    ScreenLockApi.requestUnlockCallback = undefined;
    ScreenLockApi.unlockWhenNoPswCallback = undefined;
    ScreenLockApi.notifyUnlockTransitionCallback = undefined;
    ScreenLockApi.isScreenLockShowCallback = undefined;
    ScreenLockApi.isDeviceLockedCallback = undefined;
  }

  /**
   * 请求接口
   *
   * @param callback 成功回调接口
   * @param withDelay 是否延时
   */
  public static requestUnlock(callback?: LockUnlockCallback, withDelay: boolean = false,
    cancelCallback?: Callback<void>): void {
    log.showInfo(`requestUnlock withDelay ${withDelay} from outer`);
    if (SystemSwitchUtils.isUseNewScreenLock()) {
      ScreenLockUnlockService.getInstance().requestUnlock(callback);
    } else {
      if (ScreenLockApi.requestUnlockCallback) {
        ScreenLockApi.requestUnlockCallback?.(callback, withDelay, cancelCallback);
      } else {
        log.showError('requestUnlock requestUnlockCallback undefined');
      }
    }
  }

  /**
   * 请求解锁,携带键盘显示位置
   *
   * @param keyboardPosition 密码页键盘位置
   * @param callback 成功回调接口
   */
  public static requestUnlockWithPosition(keyboardPosition: number = 0, callback?: LockUnlockCallback): void {
    log.showInfo(`requestUnlockWithPosition keyboardPosition:${keyboardPosition}.`);
    AppStorage.setOrCreate(SlStorageKey.KEYBOARD_POSITION, keyboardPosition);
    ScreenLockUnlockService.getInstance().requestUnlock(callback);
    AppStorage.delete(SlStorageKey.KEYBOARD_POSITION);
  }

  /**
   * 通知WMS锁屏状态
   */
  public static notifyEarlyUnlockTransition(): void {
    log.showInfo('notifyEarlyUnlockTransition from outer.');
    SCBSceneSessionManager.getInstance().notifyWMSIsLockReceived(false);
  }

  /**
   * 获取锁屏页面是否显示,已废弃,推荐使用isScreenLockShow()
   *
   * @deprecated
   * @returns true显示/false不显示
   */
  public static getLock(): boolean {
    if (SystemSwitchUtils.isUseNewScreenLock()) {
      return ScreenLockStateManager.getInstance().isPageShow && !ScreenLockStateManager.getInstance().isInEdite;
    } else {
      if (ScreenLockApi.getLockCallback) {
        return ScreenLockApi.getLockCallback?.();
      } else {
        log.showError('getLock getLockCallback undefined');
        return true;
      }
    }
  }

  /**
   * 检查设备当前是否处于锁定状态,并且屏幕锁需要身份进行身份验证和解锁。
   *
   * @returns 设备当前是否被锁定。
   */
  public static isDeviceLocked(): boolean {
    if (SystemSwitchUtils.isUseNewScreenLock()) {
      return ScreenLockStateManager.getInstance().isLocked;
    } else {
      if (ScreenLockApi.isDeviceLockedCallback) {
        return ScreenLockApi.isDeviceLockedCallback?.();
      } else {
        log.showError('getLock isDeviceLockedCallback undefined');
        return true;
      }
    }
  }

  /**
   * 获取锁屏页面是否显示
   *
   * @returns true显示/false不显示
   */
  public static isScreenLockShow(): boolean {
    if (SystemSwitchUtils.isUseNewScreenLock()) {
      return ScreenLockStateManager.getInstance().isPageShow;
    } else {
      if (ScreenLockApi.isScreenLockShowCallback) {
        return ScreenLockApi.isScreenLockShowCallback?.();
      } else {
        log.showError('getLock isScreenLockShowCallback undefined');
        return true;
      }
    }
  }

  /**
   * 当没有锁屏密码时解锁
   */
  public static unlockWhenNoPsw(): void {
    log.showInfo('notifyEarlyUnlockTransition from outer.');
    if (SystemSwitchUtils.isUseNewScreenLock()) {
      ScreenLockUnlockService.getInstance().requestUnlock();
    } else {
      if (ScreenLockApi.unlockWhenNoPswCallback) {
        ScreenLockApi.unlockWhenNoPswCallback?.();
      } else {
        log.showError('unlockWhenNoPsw unlockWhenNoPswCallback undefined');
      }
    }
  }

  /**
   * 当没有锁屏密码时解锁
   */
  public static notifyUnlockTransitionForPc(): void {
    log.showInfo('notifyEarlyUnlockTransition from outer.');
    if (SystemSwitchUtils.isUseNewScreenLock()) {
      return;
    }
    if (ScreenLockApi.notifyUnlockTransitionCallback) {
      ScreenLockApi.notifyUnlockTransitionCallback?.();
    } else {
      log.showError('notifyUnlockTransitionForPc notifyUnlockTransitionCallback undefined');
    }
  }

  /**
   * 查询是否Sim卡锁定
   *
   * @returns 是否Sim卡锁定
   */
  public static isSimLocked(): boolean {
    if (SystemSwitchUtils.isUseNewScreenLock()) {
      return SimCardStateManager.getInstance().isSimLocked();
    } else {
      return !!GlobalStatusCache.getInstance().getStatus(StatusCacheConst.SIM_CARD_LOCKED_KEY, false);
    }
  }
}