/*
 * 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 { AbstractEvent, AbstractFsm, AbstractState, AbstractStateFactory } from './ScreenLockFsm';
import type { MatchRule } from './ScreenLockFsm';
import { CoreEvent, CoreEventType, CoreStateType, CoreStateTypeUtils } from './ScreenLockCoreFsm';

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

const SCREEN_OFF_PAGE = 0x1000; // 熄屏页
const MAIN_PAGE = 0x2000; // 主页
const BOUNCER_PAGE = 0x4000; // 密码页
const UNLOCK_PAGE = 0x8000; // 非锁屏页

const NORMAL_SHOW = 0x100; // 常态显示态
const EDIT = 0x200; // 编辑态
const FAKE_AOD = 0x400; // 假AOD态
const INACTIVE = 0x800; // 去激活态

const EDIT_EXTENSION = 0x20; // 编辑外部接入态

/**
 * 定义:主页状态机-状态类型
 */
export enum MpStateType {
  /**
   * 初始态
   */
  INIT_STATE = 0,

  /**
   * 熄屏态
   */
  SCREEN_OFF_STATE = SCREEN_OFF_PAGE,

  /**
   * 常态锁屏态
   */
  NORMAL_LOCK_STATE = MAIN_PAGE | NORMAL_SHOW | 0x1,

  /**
   * 去激活态
   */
  INACTIVE_STATE = MAIN_PAGE | INACTIVE,

  /**
   * 常态解锁态
   */
  NORMAL_UNLOCK_STATE = MAIN_PAGE | NORMAL_SHOW | 0x2,

  /**
   * 常态AOD态
   */
  NORMAL_FAKE_AOD_STATE = MAIN_PAGE | FAKE_AOD,

  /**
   * 编辑态常态
   */
  EDIT_NORMAL_STATE = MAIN_PAGE | EDIT,

  /**
   * 主页编辑态
   */
  EDIT_MAIN_PAGE_STATE_FULL = MAIN_PAGE | EDIT | 0x1,

  /**
   * 时钟编辑态
   */
  EDIT_CLOCK_STATE = MAIN_PAGE | EDIT | 0x2,

  /**
   * 卡片编辑态
   */
  EDIT_CARD_STATE = MAIN_PAGE | EDIT | 0x3,

  /**
   * 卡片编辑详情态
   */
  EDIT_CARD_DETAIL_STATE = MAIN_PAGE | EDIT | 0x4,

  /**
   * 壁纸编辑态
   */
  EDIT_WALLPAPER_STATE = MAIN_PAGE | EDIT | EDIT_EXTENSION | 0x5,

  /**
   * 熄屏风格编辑态
   */
  EDIT_AOD_STYLE_STATE = MAIN_PAGE | EDIT | EDIT_EXTENSION | 0x6,

  /**
   * 主题编辑态
   */
  EDIT_THEME_STATE = MAIN_PAGE | EDIT | EDIT_EXTENSION | 0x7,

  /**
   * 主题自定义编辑态
   */
  EDIT_CUSTOM_THEME_STATE = MAIN_PAGE | EDIT | EDIT_EXTENSION | 0x8,

  /**
   * 图库picker态
   */
  EDIT_CLOCK_PHOTO_PICKER_STATE = MAIN_PAGE | EDIT | EDIT_EXTENSION | 0x9,

  /**
   * Aod图库picker态
   */
  EDIT_AOD_PHOTO_PICKER_STATE = MAIN_PAGE | EDIT | 0xa,

  /**
   * 密码页态
   */
  BOUNCER_STATE = BOUNCER_PAGE,

  /**
   * 非锁屏态
   */
  UNLOCK_STATE = UNLOCK_PAGE,
}

/**
 * 主页状态机-状态类型工具类
 */
export class MpStateTypeUtils {
  private constructor() {
  }

  /**
   * 是否处于息屏态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isScreenOffState(stateType: MpStateType): boolean {
    return (stateType & SCREEN_OFF_PAGE) === SCREEN_OFF_PAGE;
  }

  /**
   * 是否处于主页态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isMainPageState(stateType: MpStateType): boolean {
    return (stateType & MAIN_PAGE) === MAIN_PAGE;
  }

  /**
   * 是否处于常态显示态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isNormalShowState(stateType: MpStateType): boolean {
    return (stateType & NORMAL_SHOW) === NORMAL_SHOW;
  }

  /**
   * 是否处于常态锁屏态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isNormalLockState(stateType: MpStateType): boolean {
    return stateType === MpStateType.NORMAL_LOCK_STATE;
  }

  /**
   * 是否处于常态解锁态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isNormalUnlockState(stateType: MpStateType): boolean {
    return stateType === MpStateType.NORMAL_UNLOCK_STATE;
  }

  /**
   * 是否处于假AOD态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isFakeAodState(stateType: MpStateType): boolean {
    return stateType === MpStateType.NORMAL_FAKE_AOD_STATE;
  }

  /**
   * 是否处于去激活态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isInactiveState(stateType: MpStateType): boolean {
    return stateType === MpStateType.INACTIVE_STATE;
  }

  /**
   * 是否处于密码校验态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isBouncerState(stateType: MpStateType): boolean {
    return stateType === MpStateType.BOUNCER_STATE;
  }

  /**
   * 是否处于编辑预览态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isEditPreviewState(stateType: MpStateType): boolean {
    return stateType === MpStateType.EDIT_NORMAL_STATE;
  }

  /**
   * 是否处于编辑态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isEditState(stateType: MpStateType): boolean {
    return (stateType & EDIT) === EDIT;
  }

  /**
   * 是否处于外部接入编辑态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isEditExtensionState(stateType: MpStateType): boolean {
    return (stateType & EDIT_EXTENSION) === EDIT_EXTENSION;
  }

  /**
   * 是否处于编辑全屏态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isEditFullState(stateType: MpStateType): boolean {
    return stateType === MpStateType.EDIT_MAIN_PAGE_STATE_FULL || stateType === MpStateType.EDIT_CLOCK_STATE ||
      stateType === MpStateType.EDIT_CARD_STATE || stateType === MpStateType.EDIT_CARD_DETAIL_STATE;
  }

  /**
   * 是否处于编辑时钟态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isEditClockState(stateType: MpStateType): boolean {
    return stateType === MpStateType.EDIT_CLOCK_STATE;
  }

  /**
   * 是否处于编辑扩展态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isEditExtendState(stateType: MpStateType): boolean {
    return stateType === MpStateType.EDIT_WALLPAPER_STATE || stateType === MpStateType.EDIT_AOD_STYLE_STATE ||
      stateType === MpStateType.EDIT_THEME_STATE || stateType === MpStateType.EDIT_CUSTOM_THEME_STATE ||
      stateType === MpStateType.EDIT_AOD_PHOTO_PICKER_STATE;
  }

  /**
   * 是否处于解锁态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isUnlockState(stateType: MpStateType): boolean {
    return stateType === MpStateType.UNLOCK_STATE;
  }

  /**
   * 时钟编辑的拉起图库Picker状态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isEditClockPickerState(stateType: MpStateType): boolean {
    return stateType === MpStateType.EDIT_CLOCK_PHOTO_PICKER_STATE;
  }

  /**
   * Aod编辑的拉起图库Picker状态
   *
   * @param stateType 判断的状态
   * @returns true是/false否
   */
  public static isEditAodPickerState(stateType: MpStateType): boolean {
    return stateType === MpStateType.EDIT_AOD_PHOTO_PICKER_STATE;
  }
}

/**
 * 定义:主页状态机-事件类型
 */
export enum MpEventType {
  /**
   * 进入熄屏态(由主状态机映射)
   */
  ENTER_SCREEN_OFF,

  /**
   * 进入主页锁屏态(由主状态机映射)
   */
  ENTER_MAIN_PAGE_LOCK,

  /**
   * 进入主页去激活态(由主状态机映射)
   */
  ENTER_MAIN_PAGE_INACTIVE,

  /**
   * 进入主页解锁态(由主状态机映射)
   */
  ENTER_MAIN_PAGE_UNLOCK,

  /**
   * 进入主页编辑态(由主状态机映射)
   */
  ENTER_MAIN_PAGE_EDIT,

  /**
   * 进入主页假AOD态(由主状态机映射)
   */
  ENTER_MAIN_PAGE_FAKE_AOD,

  /**
   * 进入密码页态(由主状态机映射)
   */
  ENTER_BOUNCER,

  /**
   * 进入未锁屏态(由主状态机映射)
   */
  ENTER_UNLOCK,

  /**
   * 侧滑返回
   */
  SLIDE_BACK,

  /**
   * 进入主页编辑态(1、点击空白处)
   */
  ENTER_EDIT_MAIN_PAGE_FULL,

  /**
   * 进入编辑时钟(1、点击时钟)
   */
  ENTER_EDIT_CLOCK,

  /**
   * 进入主页编辑态(1、点击卡片)
   */
  ENTER_EDIT_CARD,

  /**
   * 进入主页编辑态(1、点击卡片半模弹框应用)
   */
  ENTER_EDIT_CARD_DETAIL,

  /**
   * 进入编辑壁纸(点击壁纸按钮)
   */
  ENTER_EDIT_WALLPAPER,

  /**
   * 进入编辑熄屏风格(点击熄屏风格按钮)
   */
  ENTER_EDIT_AOD_STYLE,

  /**
   * 进入编辑主题(点击主题按钮)
   */
  ENTER_EDIT_THEME,

  /**
   * 进入自定义主题(点击自定义主题按钮)
   */
  ENTER_EDIT_CUSTOM_THEME,

  /**
   * 进入时钟编辑-图库态
   */
  ENTER_EDIT_CLOCK_PHOTO_PICKER,

  /**
   * 进入Aod编辑-图库态
   */
  ENTER_EDIT_AOD_PHOTO_PICKER,

  /**
   * 退出Aod编辑-图库态
   */
  EXIT_EDIT_AOD_PHOTO_PICKER,

  /**
   * 退出编辑壁纸(关闭壁纸编辑页面);退出编辑熄屏风格(关闭熄屏风格编辑页面);退出编辑主题(关闭主题编辑页面);退出时钟编辑图库
   */
  EXIT_EDIT_EXTENSION,

  /**
   * 退出全屏编辑态,进入编辑引导页面:1、点击返回键;
   */
  EXIT_EDIT_MAIN_PAGE_STATE_FULL_BACK,
}

/**
 * 主页状态机事件
 */
export class MpEvent extends AbstractEvent<MpEventType> {
  public toString(): string {
    return MpEventType[this.eventType] ?? 'Unknown_MpEvent';
  }
}

/**
 * 抽象主页状态
 */
abstract class AbstractMpState extends AbstractState<MpStateType, MpEvent> {
  public toString(): string {
    return MpStateType[this.stateType] ?? 'Unknown_MpState';
  }
}

/**
 * 主状态映射态
 */
abstract class CoreMappingState extends AbstractMpState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.ENTER_SCREEN_OFF:
        return MpStateType.SCREEN_OFF_STATE;
      case MpEventType.ENTER_MAIN_PAGE_LOCK:
        return MpStateType.NORMAL_LOCK_STATE;
      case MpEventType.ENTER_MAIN_PAGE_INACTIVE:
        return MpStateType.INACTIVE_STATE;
      case MpEventType.ENTER_MAIN_PAGE_UNLOCK:
        return MpStateType.NORMAL_UNLOCK_STATE;
      case MpEventType.ENTER_MAIN_PAGE_EDIT:
        return MpStateType.EDIT_NORMAL_STATE;
      case MpEventType.ENTER_MAIN_PAGE_FAKE_AOD:
        return MpStateType.NORMAL_FAKE_AOD_STATE;
      case MpEventType.ENTER_BOUNCER:
        return MpStateType.BOUNCER_STATE;
      case MpEventType.ENTER_UNLOCK:
        return MpStateType.UNLOCK_STATE;
    }
    return this.stateType; // 默认不做状态转移
  }
}

/**
 * 初始态
 */
class InitState extends CoreMappingState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    return super.handleEvent(event);
  }
}

/**
 * 熄屏态
 */
class ScreenOffState extends CoreMappingState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    return super.handleEvent(event);
  }
}

/**
 * 常态锁屏态
 */
class NormalLockState extends CoreMappingState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    return super.handleEvent(event);
  }
}

/**
 * 去激活态
 */
class InactiveState extends CoreMappingState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    return super.handleEvent(event);
  }
}

/**
 * 常态解锁态
 */
class NormalUnlockState extends CoreMappingState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    return super.handleEvent(event);
  }
}

/**
 * 假AOD态
 */
class FakeAodState extends CoreMappingState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    return super.handleEvent(event);
  }
}

/**
 * 编辑态
 */
abstract class EditState extends CoreMappingState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    if (event.eventType === MpEventType.ENTER_MAIN_PAGE_EDIT) {
      return this.stateType; // 切到自身时,不处理
    }
    return super.handleEvent(event);
  }
}

/**
 * 编辑态常态
 */
class EditNormalState extends EditState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.SLIDE_BACK:
        return MpStateType.NORMAL_UNLOCK_STATE;
      case MpEventType.ENTER_EDIT_MAIN_PAGE_FULL:
        return MpStateType.EDIT_MAIN_PAGE_STATE_FULL;
      case MpEventType.ENTER_EDIT_CLOCK:
        return MpStateType.EDIT_CLOCK_STATE;
      case MpEventType.ENTER_EDIT_CARD:
        return MpStateType.EDIT_CARD_STATE;
      case MpEventType.ENTER_EDIT_WALLPAPER:
        return MpStateType.EDIT_WALLPAPER_STATE;
      case MpEventType.ENTER_EDIT_AOD_STYLE:
        return MpStateType.EDIT_AOD_STYLE_STATE;
      case MpEventType.ENTER_EDIT_THEME:
        return MpStateType.EDIT_THEME_STATE;
      case MpEventType.ENTER_EDIT_CUSTOM_THEME:
        return MpStateType.EDIT_CUSTOM_THEME_STATE;
    }
    return super.handleEvent(event);
  }
}

/**
 * 主页编辑态
 */
class EditMainPageState extends EditState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.SLIDE_BACK:
      case MpEventType.EXIT_EDIT_MAIN_PAGE_STATE_FULL_BACK:
        return MpStateType.EDIT_NORMAL_STATE;
      case MpEventType.ENTER_EDIT_CLOCK:
        return MpStateType.EDIT_CLOCK_STATE;
      case MpEventType.ENTER_EDIT_CARD:
        return MpStateType.EDIT_CARD_STATE;
    }
    return super.handleEvent(event);
  }
}

/**
 * 时钟编辑态
 */
class EditClockState extends EditState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.SLIDE_BACK:
      case MpEventType.EXIT_EDIT_MAIN_PAGE_STATE_FULL_BACK:
        return MpStateType.EDIT_NORMAL_STATE;
      case MpEventType.ENTER_EDIT_MAIN_PAGE_FULL:
        return MpStateType.EDIT_MAIN_PAGE_STATE_FULL;
      case MpEventType.ENTER_EDIT_CARD:
        return MpStateType.EDIT_CARD_STATE;
      case MpEventType.ENTER_EDIT_CLOCK_PHOTO_PICKER:
        return MpStateType.EDIT_CLOCK_PHOTO_PICKER_STATE;
    }
    return super.handleEvent(event);
  }
}

/**
 * 卡片编辑态
 */
class EditCardState extends EditState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.SLIDE_BACK:
      case MpEventType.ENTER_EDIT_MAIN_PAGE_FULL:
        return MpStateType.EDIT_MAIN_PAGE_STATE_FULL;
      case MpEventType.EXIT_EDIT_MAIN_PAGE_STATE_FULL_BACK:
        return MpStateType.EDIT_NORMAL_STATE;
      case MpEventType.ENTER_EDIT_CLOCK:
        return MpStateType.EDIT_CLOCK_STATE;
      case MpEventType.ENTER_EDIT_CARD_DETAIL:
        return MpStateType.EDIT_CARD_DETAIL_STATE;
    }
    return super.handleEvent(event);
  }
}

/**
 * 卡片编辑详情态
 */
class EditCardDetailState extends EditCardState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.SLIDE_BACK:
        return MpStateType.EDIT_CARD_STATE;
    }
    return super.handleEvent(event);
  }
}

/**
 * 壁纸编辑态
 */
class EditWallpaperState extends EditState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.SLIDE_BACK:
      case MpEventType.EXIT_EDIT_EXTENSION:
        return MpStateType.EDIT_NORMAL_STATE;
    }
    return super.handleEvent(event);
  }
}

/**
 * 熄屏风格编辑态
 */
class EditAodStyleState extends EditState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.SLIDE_BACK:
      case MpEventType.EXIT_EDIT_EXTENSION:
        return MpStateType.EDIT_NORMAL_STATE;
      case MpEventType.ENTER_EDIT_AOD_PHOTO_PICKER:
        return MpStateType.EDIT_AOD_PHOTO_PICKER_STATE;
    }
    return super.handleEvent(event);
  }
}

/**
 * 自定义主题态
 */
class EditCustomThemeState extends EditState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.SLIDE_BACK:
      case MpEventType.EXIT_EDIT_EXTENSION:
        return MpStateType.EDIT_NORMAL_STATE;
    }
    return super.handleEvent(event);
  }
}

/**
 * photopicker态
 */
class EditClockPhotoPickerState extends EditState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.SLIDE_BACK:
      case MpEventType.EXIT_EDIT_EXTENSION:
        return MpStateType.EDIT_CLOCK_STATE;
    }
    return super.handleEvent(event);
  }
}

/**
 * AodPhotoPicker态
 */
class EditAodPhotoPickerState extends EditState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.SLIDE_BACK:
      case MpEventType.EXIT_EDIT_AOD_PHOTO_PICKER:
        return MpStateType.EDIT_AOD_STYLE_STATE;
    }
    return super.handleEvent(event);
  }
}

/**
 * 主题编辑态
 */
class EditThemeState extends EditState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    switch (event.eventType) {
      case MpEventType.SLIDE_BACK:
      case MpEventType.EXIT_EDIT_EXTENSION:
        return MpStateType.EDIT_NORMAL_STATE;
    }
    return super.handleEvent(event);
  }
}

/**
 * 密码页态
 */
class BouncerState extends CoreMappingState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    return super.handleEvent(event);
  }
}

/**
 * 未锁屏态
 */
class UnlockState extends CoreMappingState {
  public handleEvent(event: MpEvent): MpStateType | AbstractState<MpStateType, MpEvent> {
    return super.handleEvent(event);
  }
}

/**
 * 主页状态工厂
 */
class MpStateFactory extends AbstractStateFactory<MpStateType, MpEvent> {
  constructor() {
    super();
    this.addSateConstructor(MpStateType.INIT_STATE, (stateType: MpStateType) => new InitState(stateType));
    this.addSateConstructor(MpStateType.SCREEN_OFF_STATE, (stateType: MpStateType) => new ScreenOffState(stateType));
    this.addSateConstructor(MpStateType.NORMAL_LOCK_STATE, (stateType: MpStateType) => new NormalLockState(stateType));
    this.addSateConstructor(MpStateType.INACTIVE_STATE, (stateType: MpStateType) => new InactiveState(stateType));
    this.addSateConstructor(MpStateType.NORMAL_UNLOCK_STATE,
      (stateType: MpStateType) => new NormalUnlockState(stateType));
    this.addSateConstructor(MpStateType.NORMAL_FAKE_AOD_STATE, (stateType: MpStateType) => new FakeAodState(stateType));
    this.addSateConstructor(MpStateType.EDIT_NORMAL_STATE, (stateType: MpStateType) => new EditNormalState(stateType));
    this.addSateConstructor(MpStateType.EDIT_MAIN_PAGE_STATE_FULL,
      (stateType: MpStateType) => new EditMainPageState(stateType));
    this.addSateConstructor(MpStateType.EDIT_CLOCK_STATE, (stateType: MpStateType) => new EditClockState(stateType));
    this.addSateConstructor(MpStateType.EDIT_CARD_STATE, (stateType: MpStateType) => new EditCardState(stateType));
    this.addSateConstructor(MpStateType.EDIT_CARD_DETAIL_STATE,
      (stateType: MpStateType) => new EditCardDetailState(stateType));
    this.addSateConstructor(MpStateType.EDIT_WALLPAPER_STATE,
      (stateType: MpStateType) => new EditWallpaperState(stateType));
    this.addSateConstructor(MpStateType.EDIT_AOD_STYLE_STATE,
      (stateType: MpStateType) => new EditAodStyleState(stateType));
    this.addSateConstructor(MpStateType.EDIT_THEME_STATE, (stateType: MpStateType) => new EditThemeState(stateType));
    this.addSateConstructor(MpStateType.EDIT_CUSTOM_THEME_STATE,
      (stateType: MpStateType) => new EditCustomThemeState(stateType));
    this.addSateConstructor(MpStateType.BOUNCER_STATE, (stateType: MpStateType) => new BouncerState(stateType));
    this.addSateConstructor(MpStateType.UNLOCK_STATE, (stateType: MpStateType) => new UnlockState(stateType));
    this.addSateConstructor(MpStateType.EDIT_CLOCK_PHOTO_PICKER_STATE,
      (stateType: MpStateType) => new EditClockPhotoPickerState(stateType));
    this.addSateConstructor(MpStateType.EDIT_AOD_PHOTO_PICKER_STATE,
      (stateType: MpStateType) => new EditAodPhotoPickerState(stateType));
  }
}

/**
 * 定义匹配规则接口
 */
interface MpMatchRule extends MatchRule<CoreStateType, CoreEvent, MpEventType | undefined> {
  matched: (oldState: CoreStateType, newState: CoreStateType, event?: CoreEvent) => MpEventType | undefined;
}

/**
 * 主页状态机匹配规则
 */
const MP_FSM_MATCH_RULES: MpMatchRule[] =
  [
    // 进入熄屏态
    {
      matched: (oldState: CoreStateType, newState: CoreStateType): MpEventType | undefined => {
        if (!CoreStateTypeUtils.isInScreenOff(oldState) && CoreStateTypeUtils.isInScreenOff(newState)) {
          return MpEventType.ENTER_SCREEN_OFF;
        }
        return undefined;
      }
    },
    // 进入主页常规锁屏态
    {
      matched: (oldState: CoreStateType, newState: CoreStateType, event?: CoreEvent): MpEventType | undefined => {
        if (event?.eventType === CoreEventType.USER_DEACTIVATE && newState === CoreStateType.MAIN_PAGE_LOCK_STATE) {
          return MpEventType.ENTER_MAIN_PAGE_INACTIVE;
        }
        if ((event?.eventType === CoreEventType.USER_ACTIVATE || oldState !== CoreStateType.MAIN_PAGE_LOCK_STATE) &&
          newState === CoreStateType.MAIN_PAGE_LOCK_STATE) {
          return MpEventType.ENTER_MAIN_PAGE_LOCK;
        }
        return undefined;
      }
    },
    // 进入主页常规解锁态
    {
      matched: (oldState: CoreStateType, newState: CoreStateType): MpEventType | undefined => {
        if (oldState !== CoreStateType.MAIN_PAGE_UNLOCK_STATE && newState === CoreStateType.MAIN_PAGE_UNLOCK_STATE) {
          return MpEventType.ENTER_MAIN_PAGE_UNLOCK;
        }
        return undefined;
      }
    },
    // 进入主页编辑态
    {
      matched: (oldState: CoreStateType, newState: CoreStateType): MpEventType | undefined => {
        if (!CoreStateTypeUtils.isInEditMainPage(oldState) && CoreStateTypeUtils.isInEditMainPage(newState)) {
          return MpEventType.ENTER_MAIN_PAGE_EDIT;
        }
        return undefined;
      }
    },
    // 进入主页假AOD态
    {
      matched: (oldState: CoreStateType, newState: CoreStateType): MpEventType | undefined => {
        if (!CoreStateTypeUtils.isInFakeAodMainPage(oldState) && CoreStateTypeUtils.isInFakeAodMainPage(newState)) {
          return MpEventType.ENTER_MAIN_PAGE_FAKE_AOD;
        }
        return undefined;
      }
    },
    // 进入密码页态
    {
      matched: (oldState: CoreStateType, newState: CoreStateType): MpEventType | undefined => {
        if (!CoreStateTypeUtils.isInBouncePage(oldState) && CoreStateTypeUtils.isInBouncePage(newState)) {
          return MpEventType.ENTER_BOUNCER;
        }
        return undefined;
      }
    },
    // 进入未锁屏态
    {
      matched: (oldState: CoreStateType, newState: CoreStateType): MpEventType | undefined => {
        if (oldState !== CoreStateType.UNLOCK_STATE && newState === CoreStateType.UNLOCK_STATE) {
          return MpEventType.ENTER_UNLOCK;
        }
        return undefined;
      }
    },
  ];

/**
 * 定义锁屏的主页状态机
 */
export class MainPageFsm extends AbstractFsm<MpStateType, MpEvent> {
  constructor(persistentId: number) {
    super(TAG + persistentId, MpStateType.INIT_STATE, new MpStateFactory());
  }

  /**
   * 提交核心状态机事件
   *
   * @param eventIn 状态机事件
   */
  public submitEvent(eventIn: MpEvent | MpEventType): void {
    let event: MpEvent;
    if (eventIn instanceof MpEvent) {
      event = eventIn as MpEvent;
    } else {
      event = new MpEvent(eventIn as MpEventType);
    }
    log.showInfo('submitEvent:' + event.toString());
    this.processEvent(event);
  }

  /**
   * 映射主状态机状态变更
   *
   * @param oldState 主状态机原状态
   * @param newState 主状态机新状态
   * @param event 状态机事件
   */
  public matchCoreFsmChange(oldState: CoreStateType, newState: CoreStateType, event?: CoreEvent): void {
    for (let matchRule of MP_FSM_MATCH_RULES) {
      let eventType: MpEventType | undefined = matchRule.matched(oldState, newState, event);
      if (eventType !== undefined) {
        this.submitEvent(eventType);
        break;
      }
    }
  }
}