/*
 * 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, Logger, SingletonHelper } from '@ohos/basicutils';
import GridLayoutItemInfo from '../bean/GridLayoutItemInfo';
import { ExposureData } from '../bean/ExposureData';
import type {
  DesktopExposureData,
  FolderExposureData,
  StackExposureData,
  FolderApp,
  DesktopAppInfo,
  DesktopFolderInfo,
  DesktopCardInfo,
  DesktopStackInfo,
  FormStackInfo
} from '../bean/ExposureData';
import { RecentLayoutCacheMgr } from '../dock/cache/RecentLayoutCacheMgr';
import { FolderManager } from '../folder/next/common/model/FolderManager';
import { LaunchLayoutCacheManager } from '../cache/layout/LaunchLayoutCacheManager';
import { CommonConstants } from '../constants/CommonConstants';
import { DockItemInfo } from '../bean/DockItemInfo';
import { ResidentLayoutCacheMgr } from '../dock/cache/ResidentLayoutCacheMgr';
import { CardItemInfo } from '../bean/CardItemInfo';
import { DailyScheduledReporter } from '../hisysevent/DailyScheduledReporter';
import GridLayoutUtil from '../utils/GridLayoutUtil';
import { systemDateTime } from '@kit.BasicServicesKit';
import { HiSysEventUtil } from '@ohos/frameworkwrapper';
import { DisplayCountViewModel } from '../displaycount/DisplayCountViewModel';
import { FolderViewModel } from '../folder/FolderViewModel';

const TAG: string = 'ExposureManager';
const PRE_INSTALL_EXPOSURE_TIME: number = 3000; // 单位:毫秒
const log: Logger = Logger.getLogHelper(LogDomain.HOME);
const STATION_DESKTOP: string = 'desktop';
const STATION_DOCK: string = 'dock';
const FOLDER_DEFAULT_AREA: number = 1;
const DISPLAY_DEFAULT_COUNT: number = 1;
const DESKTOP_EXPOSURE_DATA: string = 'DESKTOP_EXPOSURE_DATA';
const FOLDER_EXPOSURE_DATA: string = 'FOLDER_EXPOSURE_DATA';
const STACK_EXPOSURE_DATA: string = 'STACK_EXPOSURE_DATA';

/**
 * 统一管理文件夹,桌面,堆叠的曝光操作
 */
export class ExposureManager {
  public static getInstance = SingletonHelper.createFactory(() => new ExposureManager());
  // 文件夹曝光操作相关参数
  private folderExposureTimeStart: number = -1;
  private folderPageIndex: number = 0;
  private openFolderData: GridLayoutItemInfo | null = null;

  // 桌面曝光操作相关参数
  private desktopExposureTimeStart: number = -1;
  private oldDesktopPageIndex: number = 0;
  private newDesktopPageIndex: number = 1;

  // 堆叠曝光操作相关参数
  private stackExposureTimeStart: number = -1;
  private formStackInfo: FormStackInfo | null = null;

  // 已经曝光的存储的数据
  private exposureData: ExposureData = new ExposureData();

  // 每日定时任务
  private dailyTask = (): Promise<void> => this.reportExposureData();

  constructor() {
    this.startReportTask();
  }

  /**
   * 记录文件夹曝光开始时间
   * @param pageIndex
   * @returns
   */
  public async handleFolderExposureTimeStart(pageIndex: number): Promise<void> {
    log.showWarn(TAG, `handleFolderExposureTimeStart`);
    // 预装曝光打点记录打开文件夹的时间
    this.folderExposureTimeStart = systemDateTime.getUptime(systemDateTime.TimeType.STARTUP, false);
    this.folderPageIndex = pageIndex;
    this.openFolderData = FolderManager.getInstance().getOpenedFolder();
    this.handleDesktopExposureTimeEnd(this.oldDesktopPageIndex, this.newDesktopPageIndex, true);
  }

  /**
   * 记录文件夹曝光结束时间
   * @param pageIndex
   * @returns
   */
  public async handleFolderExposureTimeEnd(pageIndex: number): Promise<void> {
    // 预装曝光打点记录关闭文件夹的时间
    const folderExposureTimeStart: number = this.folderExposureTimeStart;
    const folderExposureTimeEnd: number = systemDateTime.getUptime(systemDateTime.TimeType.STARTUP, false);
    const lastTime: number = folderExposureTimeEnd - folderExposureTimeStart;
    log.showWarn(TAG, `folder exposure folderExposureTimeStart: ${folderExposureTimeStart}, lastTime: ${lastTime}`);
    if (folderExposureTimeStart > 0 && lastTime > PRE_INSTALL_EXPOSURE_TIME) {
      try {
        await this.saveFolderExposureData(Math.floor(lastTime / 1000), this.folderPageIndex);
      } catch (err) {
        log.showWarn(TAG, `saveFolderExposureData failed, code: ${err.code}, message: ${err.message}`);
      }
    }
    this.folderPageIndex = pageIndex;
    this.folderExposureTimeStart = -1;
    this.openFolderData = null;
    this.handleDesktopExposureTimeStart();
  }

  /**
   * 记录文件夹曝光数据
   * @param lastTime
   * @param pageIndex
   * @returns
   */
  public async saveFolderExposureData(lastTime: number, pageIndex: number): Promise<void> {
    const openFolderData: GridLayoutItemInfo = this.openFolderData!;
    const folderExposureDataList: FolderExposureData[] = this.exposureData.getFolderExposureDataList();
    const folderId = openFolderData.folderId!;
    const id = `${folderId}-${pageIndex}`;
    const folderData: FolderExposureData | undefined =
      folderExposureDataList.find((item: FolderExposureData) => item.id === id);
    const layoutInfo: GridLayoutItemInfo[] = openFolderData.layoutInfo ? openFolderData.layoutInfo[pageIndex] : [];
    const folderAppList: FolderApp[] = layoutInfo.map<FolderApp>((item: GridLayoutItemInfo) => {
      return {
        bundleName: item.bundleName,
        coordinate: { column: item.column, row: item.row }
      };
    });

    const isBigFolder = openFolderData.area![0] !== FOLDER_DEFAULT_AREA ||
      openFolderData.area![1] !== FOLDER_DEFAULT_AREA;

    if (folderData) {
      // 如果记录中有值
      folderData.folderName = FolderExtension.getInstance().getRealFolderName(openFolderData.folderName!);
      folderData.exposureTime = folderData.exposureTime + lastTime;
      folderData.exposureCount = folderData.exposureCount + 1;
      folderData.coordinate = { column: openFolderData.column, row: openFolderData.row };
      folderData.desktopPageIndex = openFolderData.page!;
      folderData.pageIndex = openFolderData.page!;
      folderData.folderAppList = folderAppList;
      folderData.isBigFolder = isBigFolder;
      this.showLog(folderData, FOLDER_EXPOSURE_DATA);
    } else {
      // 如果记录中没有值
      const newFolderData: FolderExposureData = {
        id: id,
        folderId: folderId,
        folderName: FolderExtension.getInstance().getRealFolderName(openFolderData.folderName!),
        exposureTime: lastTime,
        exposureCount: 1,
        coordinate: { column: openFolderData.column, row: openFolderData.row },
        desktopPageIndex: openFolderData.page!,
        pageIndex: pageIndex,
        folderAppList: folderAppList,
        isBigFolder: isBigFolder,
      };
      this.exposureData.insertFolderExposureDataList(newFolderData);
      this.showLog(newFolderData, FOLDER_EXPOSURE_DATA);
    }
  }

  /**
   * 桌面获取焦点
   * @returns
   */
  public async handleDesktopGainFocus(): Promise<void> {
    // 如果有文件夹打开,则记录文件夹初始时间
    const isFolderOpen: boolean = FolderManager.getInstance().isFolderOpen();
    if (isFolderOpen) {
      this.handleFolderExposureTimeStart(this.folderPageIndex);
    } else {
      this.handleDesktopExposureTimeStart();
    }
  }

  /**
   * 桌面失去焦点
   * @returns
   */
  public async handleDesktopLoseFocus(): Promise<void> {
    // 如果有文件夹打开,则记录文件夹结束时间
    const isFolderOpen: boolean = FolderManager.getInstance().isFolderOpen();
    if (isFolderOpen) {
      this.handleFolderExposureTimeEnd(this.folderPageIndex);
    } else {
      this.handleDesktopExposureTimeEnd(this.oldDesktopPageIndex, this.newDesktopPageIndex, true);
    }
  }

  /**
   * 记录桌面曝光开始时间
   * @returns
   */
  public async handleDesktopExposureTimeStart(): Promise<void> {
    if (FolderManager.getInstance().isFolderOpen() || this.formStackInfo) {
      return;
    }
    // 预装曝光打点记录打开文件夹的时间
    log.showWarn(TAG, `handleDesktopExposureTimeStart`);
    this.desktopExposureTimeStart = systemDateTime.getUptime(systemDateTime.TimeType.STARTUP, false);
  }

  /**
   * 记录桌面曝光结束时间
   * @param oldDesktopPageIndex
   * @param newDesktopPageIndex
   * @param isCurrent
   * @returns
   */
  public async handleDesktopExposureTimeEnd(oldDesktopPageIndex: number, newDesktopPageIndex: number,
    isCurrent: boolean = false): Promise<void> {
    this.oldDesktopPageIndex = oldDesktopPageIndex;
    this.newDesktopPageIndex = newDesktopPageIndex;
    const desktopExposureTimeStart: number = this.desktopExposureTimeStart;
    const desktopExposureTimeEnd: number = systemDateTime.getUptime(systemDateTime.TimeType.STARTUP, false);
    const lastTime: number = desktopExposureTimeEnd - desktopExposureTimeStart;
    log.showWarn(TAG, `desktop exposure desktopExposureTimeStart: ${desktopExposureTimeStart}, lastTime: ${lastTime}`);
    if (desktopExposureTimeStart > 0 && lastTime > PRE_INSTALL_EXPOSURE_TIME) {
      const pageCount: number = DisplayCountViewModel.getInstance().getDisplayCount();
      log.showWarn(TAG, `desktop exposure displayCount: ${pageCount}`);
      const pageIndexStart: number = Math.floor(this.oldDesktopPageIndex / pageCount);
      const pageIndexEnd: number = Math.floor(this.newDesktopPageIndex / pageCount);
      log.showWarn(TAG, `desktop exposure pageIndexStart: ${pageIndexStart}, pageIndexEnd: ${pageIndexEnd}, pageCount: ${pageCount}`);
      // 折叠屏中要记录所有展示页的曝光
      try {
        await this.handleSaveDesktopExposureData(pageIndexStart, pageIndexEnd, pageCount, isCurrent, lastTime);
      } catch (err) {
        log.showWarn(TAG, `saveDesktopExposureData failed, code: ${err.code}, message: ${err.message}`);
      }
    }
    this.desktopExposureTimeStart = -1;
  }

  /**
   * 处理桌面曝光数据保存
   * @param pageIndexStart
   * @param pageIndexEnd
   * @param pageCount
   * @param isCurrent
   * @param lastTime
   * @returns
   */
  private async handleSaveDesktopExposureData(pageIndexStart: number, pageIndexEnd: number, pageCount: number,
    isCurrent: boolean, lastTime: number): Promise<void> {
    if (isCurrent) {
      for (let i = pageIndexEnd * pageCount; i < pageIndexEnd * pageCount + pageCount; i++) {
        await this.saveDesktopExposureData(Math.floor(lastTime / 1000), i);
      }
    } else {
      for (let i = pageIndexStart * pageCount; i < pageIndexStart * pageCount + pageCount; i++) {
        await this.saveDesktopExposureData(Math.floor(lastTime / 1000), i);
      }
    }
  }

  /**
   * 记录桌面曝光数据
   * @param lastTime
   * @param pageIndex
   * @returns
   */
  public async saveDesktopExposureData(lastTime: number, pageIndex: number): Promise<void> {
    const desktopData: GridLayoutItemInfo[] = LaunchLayoutCacheManager.getInstance().getAllGridLayoutItemList('exposure');
    const residentDockData: DockItemInfo[] = ResidentLayoutCacheMgr.getInstance().getAllDockItems();
    const recentDockData: DockItemInfo[] = RecentLayoutCacheMgr.getInstance().getAllDockItems();
    const dockData: DockItemInfo[] = DisplayCountViewModel.getInstance().getDisplayCount() === DISPLAY_DEFAULT_COUNT ?
      residentDockData : residentDockData.concat(recentDockData);
    const desktopExposureDataList: DesktopExposureData[] = this.exposureData.getDesktopExposureDataList();
    const id = `desktop-${pageIndex}`;
    const desktopExposureData: DesktopExposureData | undefined =
      desktopExposureDataList.find((item: DesktopExposureData) => item.id === id);
    const currentPageLayoutInfoList: GridLayoutItemInfo[] =
      desktopData.filter((item: GridLayoutItemInfo) => item.page === pageIndex);

    const desktopAppList: DesktopAppInfo[] = [];
    const desktopFolderList: DesktopFolderInfo[] = [];
    const desktopCardList: DesktopCardInfo[] = [];
    const desktopStackList: DesktopStackInfo[] = [];

    this.handleDesktopExposureData(desktopAppList, desktopFolderList, desktopCardList,
      desktopStackList, currentPageLayoutInfoList);
    this.handleDockExposureData(desktopAppList, desktopFolderList, dockData);

    if (desktopExposureData) {
      // 更新数据
      desktopExposureData.desktopPageIndex = pageIndex;
      desktopExposureData.exposureTime = desktopExposureData.exposureTime + lastTime;
      desktopExposureData.exposureCount = desktopExposureData.exposureCount + 1;
      desktopExposureData.desktopAppInfoList = desktopAppList;
      desktopExposureData.desktopFolderInfoList = desktopFolderList;
      desktopExposureData.desktopCardInfoList = desktopCardList;
      desktopExposureData.desktopStackInfoList = desktopStackList;
      this.showLog(desktopExposureData, DESKTOP_EXPOSURE_DATA);
    } else {
      // 插入新数据
      const newDesktopData: DesktopExposureData = {
        id: id,
        desktopPageIndex: pageIndex,
        exposureTime: lastTime,
        exposureCount: 1,
        desktopAppInfoList: desktopAppList,
        desktopFolderInfoList: desktopFolderList,
        desktopCardInfoList: desktopCardList,
        desktopStackInfoList: desktopStackList,
      };

      this.exposureData.insertDesktopExposureDataList(newDesktopData);
      this.showLog(newDesktopData, DESKTOP_EXPOSURE_DATA);
    }
  }

  /**
   * 处理桌面曝光数据
   * @param appList
   * @param folderList
   * @param cardList
   * @param stackList
   * @param currentPageLayoutInfoList
   * @returns
   */
  private handleDesktopExposureData(desktopAppList: DesktopAppInfo[], desktopFolderList: DesktopFolderInfo[],
    desktopCardList: DesktopCardInfo[], desktopStackList: DesktopStackInfo[],
    currentPageLayoutInfoList: GridLayoutItemInfo[]): void {
    // 添加桌面数据
    currentPageLayoutInfoList.forEach((layoutInfo: GridLayoutItemInfo) => {
      if (layoutInfo.typeId === CommonConstants.TYPE_APP || layoutInfo.typeId === CommonConstants.TYPE_SHORTCUT_ICON) {
        const appItem: DesktopAppInfo = {
          bundleName: layoutInfo.bundleName,
          coordinate: { column: layoutInfo.column, row: layoutInfo.row },
          station: STATION_DESKTOP,
        };
        desktopAppList.push(appItem);
      } else if (layoutInfo.typeId === CommonConstants.TYPE_FOLDER) {
        const row: number = layoutInfo!.area![0];
        const col: number = layoutInfo!.area![1];
        const isBigFolder: boolean = row !== FOLDER_DEFAULT_AREA || col !== FOLDER_DEFAULT_AREA;
        const bigFolderDisplayAppList = this.handleBigFolderDisPlayAppList(layoutInfo, isBigFolder);
        const folderItem: DesktopFolderInfo = {
          folderId: layoutInfo.folderId!,
          coordinate: { column: layoutInfo.column, row: layoutInfo.row },
          folderName: FolderExtension.getInstance().getRealFolderName(layoutInfo.folderName!),
          bigFolderDisplayAppList: bigFolderDisplayAppList,
          station: STATION_DESKTOP,
          isBigFolder: isBigFolder
        }
        desktopFolderList.push(folderItem);
      } else if (layoutInfo.typeId === CommonConstants.TYPE_CARD) {
        const cardItem: DesktopCardInfo = {
          cardName: layoutInfo.cardName!,
          coordinate: { column: layoutInfo.column, row: layoutInfo.row },
        }
        desktopCardList.push(cardItem);
      } else if (layoutInfo.typeId === CommonConstants.TYPE_FORM_STACK) {
        const cardList = this.handleStackDisplayList(layoutInfo);
        const stackItem: DesktopStackInfo = {
          coordinate: { column: layoutInfo.column, row: layoutInfo.row },
          cardList: cardList,
        }
        desktopStackList.push(stackItem);
      }
    });
  }

  /**
   * 处理大文件夹曝光元素
   * @param layoutInfo
   * @param layoutInfoInFolder
   * @param isBigFolder
   * @returns
   */
  private handleBigFolderDisPlayAppList(layoutInfo: GridLayoutItemInfo, isBigFolder: boolean): string[] {
    const bigFolderDisplayAppList: string[] = [];
    const layoutInfoInFolder: GridLayoutItemInfo[][] | undefined = layoutInfo.layoutInfo;
    if (isBigFolder && layoutInfoInFolder) {
      // 判断为大文件夹
      const folderCount = GridLayoutUtil.getCountPerPageInFolder(layoutInfo.area);
      const layoutCount = layoutInfoInFolder[0] ? layoutInfoInFolder[0].length : 0;
      const count = Math.min(folderCount - 1, layoutCount);
      for (let i = 0; i < count; i++) {
        const el: GridLayoutItemInfo = layoutInfoInFolder[0][i];
        bigFolderDisplayAppList.push(el.bundleName);
      }
    }
    return bigFolderDisplayAppList;
  }

  /**
   * 处理堆叠卡片曝光元素
   * @param layoutInfo
   * @returns
   */
  private handleStackDisplayList(layoutInfo: GridLayoutItemInfo | FormStackInfo): string[] {
    const cardList: string[] = [];
    if (layoutInfo.layoutInfo) {
      layoutInfo.layoutInfo.flat().forEach((item: GridLayoutItemInfo | CardItemInfo) => {
        cardList.push(item.cardName!);
      })
    }
    return cardList;
  }

  /**
   * 处理桌面Dock曝光数据
   * @param appList
   * @param folderList
   * @param dockData
   * @returns
   */
  private handleDockExposureData(desktopAppList: DesktopAppInfo[], desktopFolderList: DesktopFolderInfo[],
    dockData: DockItemInfo[]): void {
    // 添加dock数据
    dockData.forEach((dockInfo: DockItemInfo) => {
      if (dockInfo.typeId === CommonConstants.TYPE_APP || dockInfo.typeId === CommonConstants.TYPE_SHORTCUT_ICON) {
        const appItem: DesktopAppInfo = {
          bundleName: dockInfo.bundleName,
          coordinate: { column: dockInfo.column, row: dockInfo.row },
          station: STATION_DOCK,
        }
        desktopAppList.push(appItem);
      } else if (dockInfo.typeId === CommonConstants.TYPE_FOLDER) {
        const folderItem: DesktopFolderInfo = {
          folderId: dockInfo.appId!,
          coordinate: { column: dockInfo.column, row: dockInfo.row },
          folderName: FolderExtension.getInstance().getRealFolderName(dockInfo.appName),
          bigFolderDisplayAppList: [],
          station: STATION_DOCK,
          isBigFolder: false
        }
        desktopFolderList.push(folderItem);
      }
    });
  }

  /**
   * 处理折叠屏
   * @param isFoldStatus
   * @param isUltraScreen
   * @returns
   */
  public async handleFolderChange(isFoldStatus: boolean): Promise<void> {
    if (this.desktopExposureTimeStart !== -1) {
      await this.handleDesktopExposureTimeEnd(this.oldDesktopPageIndex, this.newDesktopPageIndex, true);
      await this.handleDesktopExposureTimeStart();
    }
  }

  /**
   * 记录堆叠曝光开始时间
   * @param stackInfo
   * @returns
   */
  public async handleStackExposureTimeStart(stackInfo: FormStackInfo): Promise<void> {
    log.showWarn(TAG, `handleStackExposureTimeStart`);
    this.stackExposureTimeStart = systemDateTime.getUptime(systemDateTime.TimeType.STARTUP, false);
    this.formStackInfo = stackInfo;
    this.handleDesktopExposureTimeEnd(this.oldDesktopPageIndex, this.newDesktopPageIndex, true);
  }

  /**
   * 记录堆叠曝光开始结束
   * @returns
   */
  public async handleStackExposureTimeEnd(): Promise<void> {
    const stackExposureTimeStart = this.stackExposureTimeStart;
    const stackExposureTimeEnd = systemDateTime.getUptime(systemDateTime.TimeType.STARTUP, false);
    const lastTime = stackExposureTimeEnd - stackExposureTimeStart;
    log.showWarn(TAG, `stack exposure stackExposureTimeStart: ${stackExposureTimeStart}, lastTime: ${lastTime}`);
    if (stackExposureTimeStart > 0 && lastTime > PRE_INSTALL_EXPOSURE_TIME) {
      try {
        await this.saveStackExposureData(Math.floor(lastTime / 1000));
      } catch (err) {
        log.showWarn(TAG, `saveStackExposureData failed, code: ${err.code}, message: ${err.message}`);
      }
    }
    this.formStackInfo = null;
    this.stackExposureTimeStart = -1;
    this.handleDesktopExposureTimeStart();
  }

  /**
   * 记录堆叠曝光数据
   * @param lastTime
   * @returns
   */
  public async saveStackExposureData(lastTime: number): Promise<void> {
    const id = this.formStackInfo!.formStackId!;
    const stackExposureDataList = this.exposureData!.getStackExposureDataList();
    const stackExposureData: StackExposureData | undefined =
      stackExposureDataList.find((item: StackExposureData) => item.id === id);

    const cardList = this.handleStackDisplayList(this.formStackInfo!);

    if (stackExposureData) {
      stackExposureData.desktopPageIndex = this.formStackInfo!.page
      stackExposureData.exposureTime = stackExposureData.exposureTime + lastTime;
      stackExposureData.exposureCount = stackExposureData.exposureCount + 1;
      stackExposureData.cardList = cardList;
      this.showLog(stackExposureData, STACK_EXPOSURE_DATA);
    } else {
      const newStackData: StackExposureData = {
        id: id,
        desktopPageIndex: this.formStackInfo!.page,
        exposureTime: lastTime,
        exposureCount: 1,
        cardList: cardList,
        coordinate: { column: this.formStackInfo!.column, row: this.formStackInfo!.row },
      };
      this.exposureData.insertStackExposureDataList(newStackData);
      this.showLog(newStackData, STACK_EXPOSURE_DATA);
    }
  }

  /**
   * 开启上报任务
   * @returns
   */
  private startReportTask(): void {
    DailyScheduledReporter.getInstance().unRegisterTask(this.dailyTask);
    DailyScheduledReporter.getInstance().registerTask(this.dailyTask);
  }

  /**
   * 上报曝光数据
   * @returns
   */
  private async reportExposureData(): Promise<void> {
    const desktopReportData =
      this.exposureData.getDesktopExposureDataList().map((item: DesktopExposureData): string => {
        return JSON.stringify({
          desktopPageIndex: item.desktopPageIndex,
          exposureTime: item.exposureTime,
          exposureCount: item.exposureCount,
          desktopAppInfoList: item.desktopAppInfoList,
          desktopFolderInfoList: item.desktopFolderInfoList,
          desktopCardInfoList: item.desktopCardInfoList,
          desktopStackInfoList: item.desktopStackInfoList,
        });
      });
    const folderReportData =
      this.exposureData.getFolderExposureDataList().map((item: FolderExposureData): string => {
        return JSON.stringify({
          folderId: item.folderId,
          folderName: item.folderName,
          coordinate: item.coordinate,
          desktopPageIndex: item.desktopPageIndex,
          pageIndex: item.pageIndex,
          exposureTime: item.exposureTime,
          exposureCount: item.exposureCount,
          folderAppList: item.folderAppList,
          isBigFolder: item.isBigFolder,
        });
      });
    const stackReportData =
      this.exposureData.getStackExposureDataList().map((item: StackExposureData): string => {
        return JSON.stringify({
          coordinate: item.coordinate,
          desktopPageIndex: item.desktopPageIndex,
          exposureTime: item.exposureTime,
          exposureCount: item.exposureCount,
          cardList: item.cardList,
        });
      });
    const reportData = new Map<string, string[]>();
    reportData.set(DESKTOP_EXPOSURE_DATA, desktopReportData);
    reportData.set(FOLDER_EXPOSURE_DATA, folderReportData);
    reportData.set(STACK_EXPOSURE_DATA, stackReportData);
    await HiSysEventUtil.reportExposureData(reportData);
    this.exposureData.resetData();
  }

  private showLog(exposureData: DesktopExposureData | FolderExposureData | StackExposureData, type: string): void {
    if (type === DESKTOP_EXPOSURE_DATA) {
      const data: DesktopExposureData = exposureData as DesktopExposureData;
      let desktopAppInfoListStr = '';
      let desktopFolderInfoListStr = '';
      let desktopCardInfoListStr = '';
      let desktopStackInfoListStr = '';
      data.desktopAppInfoList.forEach((item: DesktopAppInfo) => {
        desktopAppInfoListStr += `{bundleName:${item.bundleName},` +
          `coordinate:{column:${item.coordinate?.column},row:${item.coordinate?.row}},` +
          `station:${item.station}},`;
      });

      data.desktopFolderInfoList.forEach((item: DesktopFolderInfo) => {
        desktopFolderInfoListStr += `{folderId:${item.folderId},` +
          `isBigFolder:${item.isBigFolder},` +
          `bigFolderDisplayAppList:[${item.bigFolderDisplayAppList.join(',')}],` +
          `coordinate:{column:${item.coordinate?.column},row:${item.coordinate?.row}},` +
          `station:${item.station}},`;
      });

      data.desktopCardInfoList.forEach((item: DesktopCardInfo) => {
        desktopCardInfoListStr += `{cardName:${item.cardName},` +
          `coordinate:{column:${item.coordinate?.column},row:${item.coordinate?.row}}},`;
      });

      data.desktopStackInfoList.forEach((item: DesktopStackInfo) => {
        desktopStackInfoListStr += `{coordinate:{column:${item.coordinate?.column},row:${item.coordinate?.row}},` +
          `cardList:[${item.cardList.join(',')}]},`;
      });

      log.showWarn(TAG, `desktop exposure save data: {` +
        `desktopPageIndex:${data.desktopPageIndex},` +
        `exposureTime:${data.exposureTime},` +
        `exposureCount:${data.exposureCount},` +
        `desktopAppInfoList:[${desktopAppInfoListStr}],` +
        `desktopFolderInfoList:[${desktopFolderInfoListStr}],` +
        `desktopCardInfoList:[${desktopCardInfoListStr}],` +
        `desktopStackInfoList:[${desktopStackInfoListStr}]}`);
    } else if (type === FOLDER_EXPOSURE_DATA) {
      const data: FolderExposureData = exposureData as FolderExposureData;
      let folderAppListStr = '';
      data.folderAppList.forEach((item: FolderApp) => {
        folderAppListStr += `{bundleName: ${item.bundleName},` +
          `coordinate:{column:${item.coordinate?.column},row:${item.coordinate?.row}}},`;
      });
      log.showWarn(TAG, `folder exposure save data: {` +
        `folderId:${data.folderId},` +
        `exposureTime:${data.exposureTime},` +
        `exposureCount:${data.exposureCount},` +
        `coordinate:{column:${data.coordinate?.column},row:${data.coordinate?.row}},` +
        `desktopPageIndex:${data.desktopPageIndex},` +
        `pageIndex:${data.pageIndex},` +
        `folderAppList:[${folderAppListStr}],` +
        `isBigFolder:${data.isBigFolder}}`);
    } else if (type === STACK_EXPOSURE_DATA) {
      const data: StackExposureData = exposureData as StackExposureData;
      log.showWarn(TAG, `stack exposure save data: {` +
        `desktopPageIndex:${data.desktopPageIndex},` +
        `exposureTime:${data.exposureTime},` +
        `exposureCount:${data.exposureCount},` +
        `cardList:[${data.cardList.join(',')}],` +
        `coordinate:{column:${data.coordinate?.column},row:${data.coordinate?.row}}}`);
    }
  }
}

class FolderExtension extends FolderViewModel {
  public static getInstance = SingletonHelper.createFactory(() => new FolderExtension());
  public constructor() {
    super();
  }

  async getNewFolderName(): Promise<string> {
    return '';
  }
}