import { ArrayUtil, PermissionUtil, StrUtil } from '@pura/harmony-utils';
import { apiService } from '../net/ApiService';
import { PrefUtils } from '../utils/PrefUtils';
import { JSON } from '@kit.ArkTS';
import { UserConfigEntity } from '../entity/UserConfigEntity';
import { instanceToPlain, plainToInstance } from 'class-transformer';
import { BannerEntity } from '../entity/BannerEntity';
import identifier from '@ohos.identifier.oaid';
import { LoginManager } from './LoginGlobalManager';
import { WxVideoConfigEntity } from '../entity/WxVideoConfig';

class UserConfigManager {
  private INVALID_OAID = "00000000-0000-0000-0000-000000000000";

  async getOaid(): Promise<string> {
    try {
      const isGranted = await PermissionUtil.checkRequestPermissions('ohos.permission.APP_TRACKING_CONSENT');
      if (isGranted) {
        const oaid = await identifier.getOAID();
        if (StrUtil.isNotEmpty(oaid) && oaid !== this.INVALID_OAID) {
          PrefUtils.put("oaid", oaid)
          return Promise.resolve(oaid);
        }
      }
    } catch (e) {
      console.error(e);
    }
    return Promise.resolve('');
  }

  async getUserConfig(): Promise<void> {
    if (StrUtil.isNotEmpty(PrefUtils.getString('userConfig'))) {
      const str = PrefUtils.getString('userConfig');
      const userConfig = plainToInstance(UserConfigEntity, JSON.parse(str));
      this.saveUserConfig(userConfig);
      return Promise.resolve()
    } else {
      return this.userConfig();
    }
  }

  async userConfig(): Promise<void> {
    try {
      const oaid = PrefUtils.getString('oaid');
      const result = await apiService.userConfig(oaid);
      if (result.isSuccess()) {
        const userConfig = plainToInstance(UserConfigEntity, result.data);
        PrefUtils.put("userConfig", JSON.stringify(instanceToPlain(userConfig)))
        this.saveUserConfig(userConfig);
        return Promise.resolve();
      } else {
        return Promise.reject(result.message);
      }
    } catch (e) {
      console.error(e);
      return Promise.reject(e);
    }
  }

  private saveUserConfig(config: UserConfigEntity) {
    LoginManager.saveToken(config.token);
    this.saveIsTemp(config.temp);
    if (config.config !== null) {
      this.saveGuideEnable(config.config.guideEnable);
      this.saveGuideHint(config.config.guideHint);
      this.saveGuidePayEnable(config.config.guidePayEnable);
      this.saveNoLoginPayEnable(config.config.noLoginPayEnable);
      this.savePayAgreementEnable(config.config.payAgreementEnable);
      this.saveWxVideoEnable(config.config.wxVideoEnable);
      this.savePlaybackEnable(config.config.playbackEnable);
      this.saveLoginType(config.config.loginType);
      this.saveTakeMaterialCourse(config.config.takeMaterialCourse);
      this.saveWxVideoCourse(config.config.wxVideoCourse);
      this.savePlaybackCourse(config.config.wxPlaybackCourse);
      this.saveWxPlaybackJoinType(config.config.wxPlaybackJoinType);
      this.saveWxVideoConfig(config.config.wxVideoConfig);
      this.saveWxVideoServiceEnable(config.config.wxVideoServiceEnable);
      this.saveDomainMap(config.config.domainMap);
      this.saveCopyContainsList(config.config.copyContainsList);
      this.saveHomeBanner(config.config.homeBanners);
      this.saveAiAuthEnable(config.config.aiAuthEnable);
    }
  }

  /**
   * 是否同意隐私政策
   * @param agree
   */
  saveIsAgreePrivacy(agree: boolean) {
    PrefUtils.put('agree_privacy', agree);
  }

  isAgreePrivacy(): boolean {
    return PrefUtils.getBoolean('agree_privacy');
  }

  /**
   * 首次使用app
   * @param isFirst
   */
  saveFirstUse(isFirst: boolean) {
    PrefUtils.put('is_first', isFirst);
  }

  isFirstUse(): boolean {
    return PrefUtils.getBoolean('is_first', true);
  }

  /**
   * 用户角色
   * @param temp true临时用户 ,false登录用户
   */
  saveIsTemp(temp: boolean) {
    PrefUtils.put('x-role', temp);
  }

  isTemp(): boolean {
    return PrefUtils.getBoolean('x-role', true);
  }

  /**
   * 是否启用引导页
   * @param enable
   */
  saveGuideEnable(enable: boolean) {
    PrefUtils.put('guide_enable', enable);
  }

  isGuideEnable(): boolean {
    return PrefUtils.getBoolean('guide_enable', true);
  }

  /**
   * 引导页提示语
   * @param enable
   */
  saveGuideHint(hint: string) {
    PrefUtils.put('guide_hint', hint);
  }

  getGuideHint(): string {
    return PrefUtils.getString('guide_hint');
  }

  /**
   * 是否启用引导页支付
   * @param enable
   */
  saveGuidePayEnable(enable: boolean) {
    PrefUtils.put('guide_pay_enable', enable);
  }

  isGuidePayEnable(): boolean {
    return PrefUtils.getBoolean('guide_pay_enable', true);
  }

  /**
   * 是否启用未登录支付
   * @param enable
   */
  saveNoLoginPayEnable(enable: boolean) {
    PrefUtils.put('nologin_pay', enable);
  }

  isNoLoginPayEnable(): boolean {
    return PrefUtils.getBoolean('nologin_pay', true);
  }

  /**
   * 是否显示支付协议
   * @param enable
   */
  savePayAgreementEnable(enable: boolean) {
    PrefUtils.put('pay_agreement', enable);
  }

  isPayAgreementEnable(): boolean {
    return PrefUtils.getBoolean('pay_agreement', true);
  }

  /**
   * 是否启用视频号功能
   * @param enable
   */
  saveWxVideoEnable(enable: boolean) {
    PrefUtils.put('wx_video_enable', enable);
  }

  isWxVideoEnable(): boolean {
    return PrefUtils.getBoolean('wx_video_enable', true);
  }

  /**
   * 是否启用直播回放功能
   * @param enable
   */
  savePlaybackEnable(enable: boolean) {
    PrefUtils.put('playback_enable', enable);
  }

  isPlaybackEnable(): boolean {
    return PrefUtils.getBoolean('playback_enable', true);
  }

  /**
   * 是否已绑定视频号助手
   * @param isBind
   */
  saveBindWxVideoHelper(isBind: boolean) {
    PrefUtils.put('bind_wx_video', isBind);
  }

  isBindWxVideoHelper(): boolean {
    return PrefUtils.getBoolean('bind_wx_video');
  }

  /**
   * 是否已绑定直播回放助手
   * @param isBind
   */
  saveBindWxPlaybackHelper(isBind: boolean) {
    PrefUtils.put('bind_wx_playback', isBind);
  }

  isBindWxPlaybackHelper(): boolean {
    return PrefUtils.getBoolean('bind_wx_playback');
  }

  /**
   * 支持的登录类型
   * @param array
   */
  saveLoginType(array?: Array<string>) {
    if (ArrayUtil.isNotEmpty(array)) {
      PrefUtils.put('login_type', JSON.stringify(array));
    }
  }

  getLoginType(): Array<string> {
    const str = PrefUtils.getString('login_type');
    if (StrUtil.isNotEmpty(str)) {
      return JSON.parse(str) as Array<string>;
    }
    return new Array('phone');
  }

  /**
   * 链接提取教程链接
   * @param url
   */
  saveTakeMaterialCourse(url?: string) {
    if (StrUtil.isNotEmpty(url)) {
      PrefUtils.put('take_material_course', url!!);
    }
  }

  getTakeMaterialCourse(): string {
    return PrefUtils.getString('take_material_course');
  }


  /**
   * 视频号教程链接
   * @param url
   */
  saveWxVideoCourse(url?: string) {
    if (StrUtil.isNotEmpty(url)) {
      PrefUtils.put('wx_video_course', url!!);
    }
  }

  getWxVideoCourse(): string {
    return PrefUtils.getString('wx_video_course');
  }

  /**
   * 直播回放教程链接
   * @param url
   */
  savePlaybackCourse(url?: string) {
    if (StrUtil.isNotEmpty(url)) {
      PrefUtils.put('playback_course', url!!);
    }
  }

  getPlaybackCourse(): string {
    return PrefUtils.getString('playback_course');
  }

  /**
   * 直播回放加群方式
   * @param type
   */
  saveWxPlaybackJoinType(type?: string) {
    if (StrUtil.isNotEmpty(type)) {
      PrefUtils.put('playback_join_type', type!!);
    }
  }

  getPlaybackJoinType(): string {
    return PrefUtils.getString('playback_join_type');
  }

  /**
   * 直播回放小程序跳转配置
   * @param config
   */
  saveWxVideoConfig(config: WxVideoConfigEntity) {
    PrefUtils.put('wx_video_config', JSON.stringify(config))
  }

  getWxVideoConfig(): WxVideoConfigEntity | null {
    const str = PrefUtils.getString('wx_video_config')
    if (StrUtil.isNotEmpty(str)) {
      return JSON.parse(str) as WxVideoConfigEntity
    }
    return null
  }

  /**
   * 视频号助手是否可用
   * @param enable
   */
  saveWxVideoServiceEnable(enable: boolean) {
    PrefUtils.put("wx_video_service_enable", enable)
  }

  isWxVideoServiceEnable(): boolean {
    return PrefUtils.getBoolean('wx_video_service_enable', true)
  }

  /**
   * 网站主机名
   * @param domains
   */
  saveDomainMap(domains: object) {
    if (domains) {
      PrefUtils.put('domain_map', JSON.stringify(domains));
    }
  }

  getDomainMap(): object {
    const str = PrefUtils.getString('domain_map');
    if (StrUtil.isNotEmpty(str)) {
      return JSON.parse(str)!!
    }
    return new Object();
  }

  /**
   * 链接识别配置
   * @param array
   */
  saveCopyContainsList(array: Array<string>) {
    PrefUtils.put('copy_contains_list', JSON.stringify(array))
  }

  getCopyContainsList(): Array<string> {
    let array = PrefUtils.getStringArray('copy_contains_list')
    if (array.length !== 0) {
      return array
    }
    return ['http://', 'https://']
  }

  /**
   * 首页banner
   * @param array
   */
  saveHomeBanner(array?: Array<BannerEntity>) {
    if (ArrayUtil.isNotEmpty(array)) {
      PrefUtils.put('home_banner', JSON.stringify(array));
    }
  }

  getHomeBanner(): Array<BannerEntity> {
    const str = PrefUtils.getString('home_banner');
    if (StrUtil.isNotEmpty(str)) {
      return JSON.parse(str) as Array<BannerEntity>;
    }
    return new Array();
  }

  /**
   * ai功能是否需要鉴权
   * @param enable
   */
  saveAiAuthEnable(enable: boolean) {
    PrefUtils.put("ai_auth_enable", enable)
  }

  isAiAuthEnable(): boolean {
    return PrefUtils.getBoolean('ai_auth_enable', true)
  }
}

export const ConfigManager = new UserConfigManager()