/*
 * 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 { ObjectCopyUtil } from '@ohos/componenthelper';
import { DragItemPosition } from '@ohos/componentdrag';
import { AppItemInfo, RdbStoreManager } from '@ohos/launchercommon';
import DefaultAppCacheManager from '../common/cache/DefaultAppCacheManager';
import { AppLayoutInfo } from '../common/viewmodel/AppLayoutInfo';
import { CheckEmptyUtils} from '@ohos/basicutils';
import { FoldAcGridLayoutConstants, FoldedDeviceAcViewModel, SCBFoldedState } from './FoldedDeviceAcViewModel';
import { AppGridItemInfo } from '@ohos/launchercommon/src/main/ets/bean/AppGridItemInfo';
import AppGridLayoutUtil from '../common/util/AppGridLayoutUtil';

const TAG = 'FoldedAppCacheManager';
const log = LogHelper.getLogHelper(LogDomain.HOME, TAG);
const PAGES_IN_ONE_SCREEN = 2;

export class FoldedAppCacheManager extends DefaultAppCacheManager {
  protected mAppPageListForLandscape: AppLayoutInfo[] = [];

  public reorderAllAppInPages(): void {
    log.showInfo('reorderAllAppInPages');

    if (!FoldedDeviceAcViewModel.getInstance().isUnFoldedHorizontal()) {
      return;
    }

    if (this.mAppPageListForLandscape.length === 0) {
      this.mAppPageListForLandscape = this.deepCloneAppList(this.mAppGridLayoutItemList);
      this.doReorderAppsToLandscape();
    }
  }

  protected getCachedAppList(): AppLayoutInfo[] {
    if (FoldedDeviceAcViewModel.getInstance().isUnFoldedHorizontal()) {
      return this.mAppPageListForLandscape;
    } else {
      return this.mAppGridLayoutItemList;
    }
  }

  public getAppGridLayoutItemsByPage(pageIndex: number): AppItemInfo[] {
    let pageList = this.mAppGridLayoutItemList;
    if (FoldedDeviceAcViewModel.getInstance().isUnFoldedHorizontal()) {
      pageList = this.mAppPageListForLandscape;
    }

    if (!pageList || pageIndex >= pageList.length) {
      return [];
    }

    let sourcePageInfo: AppItemInfo[] = pageList[pageIndex]?.pageInfo ?? [];
    let destItemList: AppItemInfo[] = [];
    sourcePageInfo.forEach((item: AppItemInfo) => {
      destItemList.push(ObjectCopyUtil.deepClone(item, new AppItemInfo()));
    });
    return destItemList;
  }

  public updateItemPositionById(updateItems: AppItemInfo[], operationDataSource?: AppLayoutInfo[],
    isOperateDb: boolean = true): boolean {
    log.showInfo(`updateItemPositionById isLocal: ${operationDataSource !== undefined}`);
    if (CheckEmptyUtils.isEmptyArr(updateItems)) {
      log.showWarn('updateItemPositionById updateItem empty');
      return false;
    }
    let dataSource: AppLayoutInfo[] = operationDataSource ? operationDataSource : this.getCachedAppList();
    if (CheckEmptyUtils.isEmptyArr(dataSource)) {
      log.showWarn(`updateItemPositionById list: ${updateItems.length} `);
      return false;
    }
    const map: Map<string, AppItemInfo> = new Map();
    updateItems.forEach((value: AppItemInfo) => map.set(this.getAppGridKey(value), value));
    log.showInfo(`updateItemPositionById map size: ${map.size}`);
    let updateDbInfo: AppGridItemInfo[] = [];
    dataSource.forEach((pageValue: AppLayoutInfo) => {
      log.showInfo(`updateItemPositionById pageIndex: ${pageValue?.index}`);
      pageValue.pageInfo?.forEach((pageItem: AppItemInfo) => {
        const updateItem: AppItemInfo | undefined = map.get(this.getAppGridKey(pageItem));
        log.showInfo(`updateItemPositionById pageItem : ${AppGridLayoutUtil.appGridItemToString(pageItem)}`);
        if (updateItem && ((pageItem.row !== updateItem.row || pageItem.column !== updateItem.column ||
          pageItem.page !== updateItem.page))) {
          pageItem.row = updateItem.row;
          pageItem.column = updateItem.column;
          pageItem.page = updateItem.page;
          log.showInfo(`updateItemPositionById update item inner: ${AppGridLayoutUtil.appGridItemToString(updateItem)}`);
          updateDbInfo.push(AppGridItemInfo.newInstanceFromAppItemInfo(updateItem));
        }
      });
    });
    this.rePageByItemPageNumber(dataSource);
    if (this.checkIfDuplicatePos(operationDataSource ?? []) && operationDataSource) {
      log.showError('updateItemPositionById duplicate data');
      this.putAppItemToGrid(operationDataSource);
      return false;
    }
    if (isOperateDb && !operationDataSource && updateDbInfo.length > 0) {
      if (FoldedDeviceAcViewModel.getInstance().isUnFoldedHorizontal()) {
        this.transformAndSyncPortraitCaches(updateDbInfo, true);
      } else {
        this.transformAndSyncLandscapeCaches(updateDbInfo, true);
      }

      try {
        RdbStoreManager.getInstance().updateAppCenterItemPositions(updateDbInfo);
      } catch (error) {
        log.showError(`updateItemPositionById with error ${error.message}`);
      }
    }
    return true;
  }

  private transformAndSyncLandscapeCaches(updateDbInfo: AppGridItemInfo[], isCrossPage: boolean = false): void {
    log.showInfo(`transformAndSyncLandscapeCaches ${isCrossPage}`);

    if (this.mAppPageListForLandscape.length === 0) {
      log.showInfo('Ignore txf landscape app coordinate for empty ls app list');
      return;
    }

    updateDbInfo.forEach((app: AppGridItemInfo, index: number) => {
      let idx = ((app?.row ?? 0) * FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_GRID_COLUMNS) + (app?.column ?? 0);
      let newMappedRow = Math.floor(idx / FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_HORIZONTAL_GRID_COLUMNS);
      let newMappedCol = idx % FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_HORIZONTAL_GRID_COLUMNS;
      log.showInfo(`transformAndSyncLsCaches-${app.bundleName}-${app.page}-${app.row}-${app.column}` +
        `-${idx}-${newMappedRow}-${newMappedCol}`);

      if (app.page !== undefined && app.page < this.mAppPageListForLandscape.length) {
        let appItem = this.mAppPageListForLandscape[app.page].pageInfo.find(item => {
          return item.appIndex === app.appIndex && item.bundleName === app.bundleName;
        });

        if (appItem) {
          log.showInfo(`Found app item in landscape list-${appItem.bundleName}-${appItem.row}-${appItem.column}`);
          appItem.row = newMappedRow;
          appItem.column = newMappedCol;
        } else if (isCrossPage) {
          for (let i = 0; i < this.mAppPageListForLandscape.length; i++) {
            appItem = this.mAppPageListForLandscape[i].pageInfo.find((item) => {
              return item.appIndex === app.appIndex && item.bundleName === app.bundleName;
            });
            if (appItem) {
              break;
            }
          }
          if (!appItem) {
            log.showError(`transformAndSyncLandscapeCaches failed. can't find ${app.bundleName}`);
            return;
          }
          log.showInfo(`transformAndSyncLandscapeCaches cross page sync ${app.bundleName}(${app.page}, ${app.row}, ${app.column}) to (${appItem.row}, ${appItem.column}, ${appItem.page})`);
          appItem.row = newMappedRow;
          appItem.column = newMappedCol;
          appItem.page = app.page;
          this.rePageByItemPageNumber(this.mAppPageListForLandscape);
        }
      }
    });
    // 重新排序数组
    for (let i = 0; i < this.mAppPageListForLandscape.length; i++) {
      this.mAppPageListForLandscape[i].pageInfo.sort((a, b) => {
        if (a.row !== b.row) {
          return (a.row ?? 0) - (b.row ?? 0);
        } else {
          return (a.column ?? 0) - (b.column ?? 0);
        }
      });
    }
  }

  private transformAndSyncPortraitCaches(updateDbInfo: AppGridItemInfo[], isCrossPage: boolean = false): void {
    log.showInfo(`transformAndSyncPortraitCaches ${isCrossPage}`);
    updateDbInfo.forEach((app: AppGridItemInfo, index: number) => {
      let idx = ((app?.row ?? 0) * 10) + (app?.column ?? 0);
      let newMappedRow = Math.floor(idx / 8);
      let newMappedCol = idx % 8;
      log.showInfo(`transformAndSyncPortCaches-${app.bundleName}-${app.page}-${app.row}-${app.column}` +
        `-${idx}-${newMappedRow}-${newMappedCol}`);
      app.row = newMappedRow;
      app.column = newMappedCol;

      if (app.page !== undefined && app.page < this.mAppGridLayoutItemList.length) {
        let appItem = this.mAppGridLayoutItemList[app.page].pageInfo.find(item => {
          return item.appIndex === app.appIndex && item.bundleName === app.bundleName;
        });

        if (appItem) {
          log.showInfo(`Found app item in potrait list-${appItem.bundleName}-${appItem.row}-${appItem.column}`);
          appItem.row = newMappedRow;
          appItem.column = newMappedCol;
        } else if (isCrossPage) {
          for (let i = 0; i < this.mAppGridLayoutItemList.length; i++) {
            appItem = this.mAppGridLayoutItemList[i].pageInfo.find((item) => {
              return item.appIndex === app.appIndex && item.bundleName === app.bundleName;
            });
            if (appItem) {
              break;
            }
          }
          if (!appItem) {
            log.showError(`transformAndSyncPortraitCaches failed. can't find ${app.bundleName}`);
            return;
          }
          log.showInfo(`transformAndSyncPortraitCaches cross page sync ${app.bundleName}(${app.page}, ${app.row}, ${app.column}) to (${appItem.row}, ${appItem.column}, ${appItem.page})`);
          appItem.row = newMappedRow;
          appItem.column = newMappedCol;
          appItem.page = app.page;
          this.rePageByItemPageNumber(this.mAppGridLayoutItemList);
        }
      }
    });
    // 重新排序数组
    for (let i = 0; i < this.mAppGridLayoutItemList.length; i++) {
      this.mAppGridLayoutItemList[i].pageInfo.sort((a, b) => {
        if (a.row !== b.row) {
          return (a.row ?? 0) - (b.row ?? 0);
        } else {
          return (a.column ?? 0) - (b.column ?? 0);
        }
      });
    }
  }

  public updateItemForDifferentPage(startPos: DragItemPosition, endItem: AppItemInfo,
    isOperateDb: boolean = true): boolean {
    log.showInfo('updateItemForDifferentPageNew');

    if (!this.checkInputPosition(startPos, endItem)) {
      return false;
    }
    if (endItem.page === undefined || endItem.column === undefined || endItem.row === undefined) {
      log.showError(`updateItemForDifferentPage failed. endItem invalid (${endItem.row}, ${endItem.column}, ${endItem.page})`);
      return false;
    }

    let fs = FoldedDeviceAcViewModel.getInstance().getCurrentFoldState();
    let isLandscape = FoldedDeviceAcViewModel.getInstance().isUnFoldedHorizontal();
    let pagesList: AppLayoutInfo[] = isLandscape ? this.mAppPageListForLandscape : this.mAppGridLayoutItemList;

    const startPageInfo: AppItemInfo[] = pagesList[startPos.page].pageInfo;
    const endPageInfo: AppItemInfo[] = pagesList[endItem.page].pageInfo;
    const startIndex: number = startPos.column + startPos.row * this.mGridStyleConfig.mColumns;
    const endIndex: number = endItem.column + endItem.row * this.mGridStyleConfig.mColumns;
    log.showInfo(`updateItemForDifferentPageNew: endPageInfo-${pagesList.length}-${isLandscape}-${fs}-` +
      `${startPos.page}-${endItem.page}-${endItem.row}-${endItem.column}-${endIndex}`);

    if (!this.checkUpdatePageInfo(startPageInfo, endPageInfo, startIndex, endIndex)) {
      return false;
    }

    let updateDbInfo: AppGridItemInfo[] = [];
    if (startPageInfo.length === 1) {
      log.showInfo('updateItemForDifferentPage: startPage only one item');
    } else {
      log.showInfo(`updateItemForDifferentPageNew-reposition-${startIndex}-${endIndex}`);
      for (let i = startIndex + 1; i < startPageInfo.length; i++) {
        const nextPos: number[] | undefined = this.getNextPosition(true, startPageInfo[i].row, startPageInfo[i].column);
        if (!nextPos) {
          log.showWarn(`updateItemForDifferentPage position invalid: [${AppGridLayoutUtil.appGridItemToString(startPageInfo[i])}]`);
          return false;
        }
        log.showInfo(`updateItemForDifferentPage start, move from: [${AppGridLayoutUtil.appGridItemToString(startPageInfo[i])}]`);
        startPageInfo[i].page = startPos.page;
        startPageInfo[i].row = nextPos[0];
        startPageInfo[i].column = nextPos[1];
        log.showInfo(`updateItemForDifferentPage start, move to: [${AppGridLayoutUtil.appGridItemToString(startPageInfo[i])}]`);
        updateDbInfo.push(AppGridItemInfo.newInstanceFromAppItemInfo(startPageInfo[i]));
      }
    }

    let idxInStartPage = startPageInfo.findIndex((itemInfo: AppItemInfo) => {
      return itemInfo.bundleName === endItem.bundleName && itemInfo.appIndex === endItem.appIndex;
    });
    log.showInfo(`updateItemForDifferentPageNew-remove cache app-${idxInStartPage}-${startPageInfo.length}-` +
      `${startIndex}`);
    let rsDelResult = startPageInfo.splice(idxInStartPage, 1);
    if (!rsDelResult || rsDelResult.length === 0 || rsDelResult[0]?.bundleName !== endItem.bundleName) {
      log.showWarn(`Delete fail00-${endItem.bundleName}-${rsDelResult[0]?.bundleName}-${startIndex}-${fs}` +
        `-${startPos.page}`);
    }
    this.updateEndPage(endIndex, endPageInfo, endItem, updateDbInfo);

    // 横竖屏数据同步
    this.moveTargetAppBetweenStartAndEndPages(isLandscape, startIndex, endIndex, startPos, endItem);

    // 删除空白页后的list,更新位置
    let beforeLen = updateDbInfo.length;
    let pageChangedApps: AppItemInfo[] = [];
    this.checkBlankPagesAndDelete(pageChangedApps);
    pageChangedApps?.forEach((itemInfo: AppItemInfo) => {
      updateDbInfo.push(AppGridItemInfo.newInstanceFromAppItemInfo(itemInfo));
    });
    log.showInfo(`findAppItem:beforeLen:${beforeLen} afterLen:${updateDbInfo.length}`);
    updateDbInfo.push(AppGridItemInfo.newInstanceFromAppItemInfo(endItem));

    if (isLandscape) {
      this.transformAndSyncPortraitCaches(updateDbInfo);
    } else {
      this.transformAndSyncLandscapeCaches(updateDbInfo);
    }

    log.showInfo('updateItemForDifferentPageNew-udb');
    return this.checkAndUpdateDB(updateDbInfo, isOperateDb);
  }

  private moveTargetAppBetweenStartAndEndPages(isLandscape: boolean, startIndex: number, endIndex: number,
    startPos: DragItemPosition, endItem: AppItemInfo): boolean {
    if (endItem.page === undefined || endItem.column === undefined || endItem.row === undefined) {
      log.showError(`moveTargetAppBetweenStartAndEndPages failed. endItem invalid (${endItem.row}, ${endItem.column}, ${endItem.page})`);
      return false;
    }
    let result = true;
    if (isLandscape) {
      let lenBefore = this.mAppGridLayoutItemList[startPos.page].pageInfo.length;
      let oldIdxInPortrait = this.mAppGridLayoutItemList[startPos.page].pageInfo.findIndex((itemInfo: AppItemInfo) => {
        return itemInfo.bundleName === endItem.bundleName && itemInfo.appIndex === endItem.appIndex;
      });
      let originItem = this.mAppGridLayoutItemList[startPos.page].pageInfo.splice(oldIdxInPortrait, 1)[0];
      let lenAfter = this.mAppGridLayoutItemList[startPos.page].pageInfo.length;
      if (!originItem || originItem.bundleName !== endItem.bundleName) {
        let curIdx = this.mAppGridLayoutItemList[startPos.page].pageInfo.findIndex((itemInfo: AppItemInfo) => {
          return itemInfo.bundleName === endItem.bundleName && itemInfo.appIndex === endItem.appIndex;
        });
        log.showWarn(`Delete fail01-${endItem.bundleName}-${originItem?.bundleName}-${startIndex}` +
          `-${oldIdxInPortrait}-${curIdx}-${lenBefore}`);
        result = false;
      } else {
        let curIdx = this.mAppGridLayoutItemList[startPos.page].pageInfo.findIndex((itemInfo: AppItemInfo) => {
          return itemInfo.bundleName === endItem.bundleName && itemInfo.appIndex === endItem.appIndex;
        });
        log.showInfo(`Delete success-${endItem.bundleName}-${originItem?.bundleName}-${startIndex}-` +
          `-${oldIdxInPortrait}-${endIndex}-${curIdx}-${lenBefore}-${lenAfter}`);
      }

      let idx = (endItem.row * 10) + endItem.column;
      let newMappedRow = Math.floor(endIndex / 8);
      let newMappedCol = endIndex % 8;
      originItem.row = newMappedRow;
      originItem.column = newMappedCol;
      originItem.page = endItem.page;
      this.mAppGridLayoutItemList[endItem.page].pageInfo.splice(endIndex, 0, originItem);
      log.showInfo(`updateItemForDifferentPage LS-${startIndex}-${idx}-${newMappedRow}-${newMappedCol}-${endIndex}, ` +
        `endPage-${endItem.page}-bdl-${originItem?.bundleName}-${lenBefore}-${lenAfter}-${endItem.bundleName}`);
    } else {
      let validLs = this.mAppPageListForLandscape.length !== 0 && this.mAppPageListForLandscape[startPos.page];
      log.showInfo(`updateItemForDifferentPageNew-pt-tls-${this.mAppPageListForLandscape.length}-${validLs}`);
      if (!validLs) {
        return result;
      }

      let realIdxLs = this.mAppPageListForLandscape[startPos.page].pageInfo.findIndex((itemInfo: AppItemInfo) => {
        return itemInfo.bundleName === endItem.bundleName && itemInfo.appIndex === endItem.appIndex;
      });
      let rsLsItems = this.mAppPageListForLandscape[startPos.page].pageInfo.splice(realIdxLs, 1);
      if (!rsLsItems || rsLsItems.length === 0) {
        log.showWarn(`Delete fail02-${endItem.bundleName}-${startIndex}` +
          `-${realIdxLs}-${this.mAppPageListForLandscape[startPos.page]?.pageInfo?.length}`);
        result = false;
        return result;
      }

      let lsInitPosItem = rsLsItems[0];
      if (!lsInitPosItem || lsInitPosItem.bundleName !== endItem.bundleName) {
        let curIdx = this.mAppPageListForLandscape[startPos.page].pageInfo.findIndex((itemInfo: AppItemInfo) => {
          return itemInfo.bundleName === endItem.bundleName && itemInfo.appIndex === endItem.appIndex;
        });
        log.showWarn(`Delete fail03-${endItem.bundleName}-${lsInitPosItem?.bundleName}-${startIndex}` +
          `-${realIdxLs}-${curIdx}`);
        result = false;
        return result;
      }

      let idx = (endItem.row * 8) + endItem.column;
      let newMappedRow = Math.floor(endIndex / 10);
      let newMappedCol = endIndex % 10;
      lsInitPosItem.row = newMappedRow;
      lsInitPosItem.column = newMappedCol;
      lsInitPosItem.page = endItem.page;
      this.mAppPageListForLandscape[endItem.page].pageInfo.splice(endIndex, 0, lsInitPosItem);
      log.showInfo(`updateItemForDifferentPage PT-${startIndex}-${idx}-${newMappedRow}-${newMappedCol}-${endIndex}` +
        `-${realIdxLs}, endPage-${endItem.page}`);
    }

    return result;
  }

  public setAppGridLayoutItemList(appGridLayoutItemList: AppLayoutInfo[]): void {
    if (appGridLayoutItemList.length === 0) {
      log.showWarn('Invalid page list data');
      return;
    }

    if (!appGridLayoutItemList[0].forLandscape) {
      log.showInfo('setAppGridLayoutItemList not for ls');
      super.setAppGridLayoutItemList(appGridLayoutItemList);
      return;
    }

    if (this.mAppPageListForLandscape.length === 0) {
      this.mAppPageListForLandscape = appGridLayoutItemList;

      if (this.mAppGridLayoutItemList.length === 0) {
        log.showInfo('setAppGridLayoutItemList tx portrait');
        this.mAppGridLayoutItemList = this.deepCloneAppList(this.mAppPageListForLandscape);
        this.doReorderAppsToPortrait();
      }
    }
  }

  public afterSetAppGridLayoutItemList(appGridLayoutItemList: AppLayoutInfo[]): void {
    if (!FoldedDeviceAcViewModel.getInstance().isUnFoldedHorizontal()) {
      return;
    }
    if (this.mAppPageListForLandscape.length === 0) {
      log.showInfo('setAppGridLayoutItemList tx landscape');
      this.mAppPageListForLandscape = this.deepCloneAppList(this.mAppGridLayoutItemList);
      this.doReorderAppsToLandscape();
    }
  }

  /**
   *
   * 应用中心更新专用缓存管理
   *
   * @param appGridLayoutItemList
   * @param changedItem
   */
  public setAndUpdateAppListForPkgChange(appGridLayoutItemList: AppLayoutInfo[], changedItem?: AppItemInfo): void {
    this.setAppGridLayoutItemList(appGridLayoutItemList);

    if (!changedItem || appGridLayoutItemList.length === 0) {
      log.showInfo(`null change item-${appGridLayoutItemList.length}`);
      return;
    }

    if (this.mAppPageListForLandscape.length === 0 || changedItem.page === undefined) {
      log.showInfo(`setAndUpdateAppListForPkgChange page invalid or empty ls list-${changedItem.page}-${this.mAppPageListForLandscape.length}`);
      return;
    }

    // 不管是竖屏還是橫屏态,横屏有缓存数据,刷新其属性
    let idxLs = this.mAppPageListForLandscape[changedItem.page]?.pageInfo?.findIndex((itemInfo: AppItemInfo) => {
      return itemInfo.bundleName === changedItem.bundleName && itemInfo.appIndex === changedItem.appIndex;
    });

    if (idxLs >= 0) {
      this.mAppPageListForLandscape[changedItem.page].pageInfo[idxLs].isUninstallAble = changedItem.isUninstallAble;
      log.showInfo(`setAndUpdateAppListForPkgChange-${idxLs}-${this.mAppPageListForLandscape[changedItem.page].pageInfo[idxLs].appStatus}`);
      this.mAppPageListForLandscape[changedItem.page].pageInfo[idxLs].appStatus = changedItem.appStatus;
      this.mAppPageListForLandscape[changedItem.page].pageInfo[idxLs].abilityName = changedItem.abilityName;
      this.mAppPageListForLandscape[changedItem.page].pageInfo[idxLs].moduleName = changedItem.moduleName;
      this.mAppPageListForLandscape[changedItem.page].pageInfo[idxLs].appIndex = changedItem.appIndex;
      this.mAppPageListForLandscape[changedItem.page].pageInfo[idxLs].appLabelId = changedItem.appLabelId;
      this.mAppPageListForLandscape[changedItem.page].pageInfo[idxLs].appIconId = changedItem.appIconId;
      this.mAppPageListForLandscape[changedItem.page].pageInfo[idxLs].applicationLabelId =
        changedItem.applicationLabelId;
      this.mAppPageListForLandscape[changedItem.page].pageInfo[idxLs].keyName = changedItem.keyName;
    } else {
      log.showInfo(`setAndUpdateAppListForPkgChange-not found-ls-${idxLs}-${changedItem?.bundleName}`);
    }

    // 橫屏需要更新豎屏緩存
    if (appGridLayoutItemList[0].forLandscape) {
      let idxPt = this.mAppGridLayoutItemList[changedItem.page]?.pageInfo?.findIndex((itemInfo: AppItemInfo) => {
        return itemInfo.bundleName === changedItem.bundleName && itemInfo.appIndex === changedItem.appIndex;
      });

      if (idxPt >= 0) {
        this.mAppGridLayoutItemList[changedItem.page].pageInfo[idxPt].isUninstallAble = changedItem.isUninstallAble;
        this.mAppGridLayoutItemList[changedItem.page].pageInfo[idxPt].appStatus = changedItem.appStatus;
        this.mAppGridLayoutItemList[changedItem.page].pageInfo[idxPt].abilityName = changedItem.abilityName;
        this.mAppGridLayoutItemList[changedItem.page].pageInfo[idxPt].moduleName = changedItem.moduleName;
        this.mAppGridLayoutItemList[changedItem.page].pageInfo[idxPt].appIndex = changedItem.appIndex;
        this.mAppGridLayoutItemList[changedItem.page].pageInfo[idxPt].appLabelId = changedItem.appLabelId;
        this.mAppGridLayoutItemList[changedItem.page].pageInfo[idxPt].appIconId = changedItem.appIconId;
        this.mAppGridLayoutItemList[changedItem.page].pageInfo[idxPt].applicationLabelId =
          changedItem.applicationLabelId;
        this.mAppGridLayoutItemList[changedItem.page].pageInfo[idxPt].keyName = changedItem.keyName;
        log.showInfo(`update portrait app data-${changedItem.appStatus}-${this.mAppGridLayoutItemList[changedItem.page].pageInfo[idxPt].appStatus}`);
      } else {
        log.showInfo(`setAndUpdateAppListForPkgChange-not found-pt-${idxPt}-${changedItem?.bundleName}`);
      }
    }
  }

  /**
   *
   * 大屏幕机安装新应用专用,会走两次
   *
   * @param appGridLayoutItemList
   * @param newAddItem
   */
  public updateAppPageList(appGridLayoutItemList: AppLayoutInfo[], newAddItem?: AppItemInfo): void {
    this.setAppGridLayoutItemList(appGridLayoutItemList);

    if (!newAddItem || appGridLayoutItemList.length === 0) {
      return;
    }

    if (this.mAppPageListForLandscape.length === 0 || newAddItem.page === undefined) {
      log.showInfo(`updateAppPageList page invalid or empty ls list-${newAddItem.page}-${this.mAppPageListForLandscape.length}`);
      return;
    }

    // 先处理横屏的缓存
    let idxLs = this.mAppPageListForLandscape[newAddItem.page].pageInfo.findIndex((itemInfo: AppItemInfo) => {
      return itemInfo.bundleName === newAddItem.bundleName && itemInfo.appIndex === newAddItem.appIndex;
    });

    if (idxLs >= 0) {
      this.mAppPageListForLandscape[newAddItem.page].pageInfo[idxLs].isUninstallAble = newAddItem.isUninstallAble;
      log.showInfo(`updateAppPageList findIndex-${idxLs}-${this.mAppPageListForLandscape[newAddItem.page].pageInfo[idxLs].appStatus}`);
      this.mAppPageListForLandscape[newAddItem.page].pageInfo[idxLs].appStatus = newAddItem.appStatus;
      this.mAppPageListForLandscape[newAddItem.page].pageInfo[idxLs].abilityName = newAddItem.abilityName;
      this.mAppPageListForLandscape[newAddItem.page].pageInfo[idxLs].moduleName = newAddItem.moduleName;
      this.mAppPageListForLandscape[newAddItem.page].pageInfo[idxLs].appIndex = newAddItem.appIndex;
      this.mAppPageListForLandscape[newAddItem.page].pageInfo[idxLs].appLabelId = newAddItem.appLabelId;
      this.mAppPageListForLandscape[newAddItem.page].pageInfo[idxLs].appIconId = newAddItem.appIconId;
      this.mAppPageListForLandscape[newAddItem.page].pageInfo[idxLs].applicationLabelId = newAddItem.applicationLabelId;
      this.mAppPageListForLandscape[newAddItem.page].pageInfo[idxLs].keyName = newAddItem.keyName;
    } else {
      if (!FoldedDeviceAcViewModel.getInstance().isUnFoldedHorizontal()) {
        let r1 = newAddItem.row;
        let c1 = newAddItem.column;
        let idx1 = (r1 ?? 0) * FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_GRID_COLUMNS + (c1 ?? 0);
        let newItem1 = ObjectCopyUtil.deepClone(newAddItem, new AppItemInfo());
        newItem1.row = Math.floor(idx1 / FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_HORIZONTAL_GRID_COLUMNS);
        newItem1.column = idx1 % FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_HORIZONTAL_GRID_COLUMNS;
        newItem1.appStatus = newAddItem.appStatus;
        this.mAppPageListForLandscape[newAddItem.page].pageInfo.push(newItem1);
        log.showInfo(`updateAppPageList add new item to ls-${idx1}-${r1}-${c1}-${newItem1.row}-${newItem1.column}-${newItem1.isUninstallAble}-${newAddItem.isUninstallAble}`);
      } else {
        log.showInfo('add new item strait to ls list');
        this.mAppPageListForLandscape[newAddItem.page].pageInfo.push(newAddItem);
      }
    }

    // 再处理竖屏的缓存
    let idxPt = this.mAppGridLayoutItemList[newAddItem.page].pageInfo.findIndex((itemInfo: AppItemInfo) => {
      return itemInfo.bundleName === newAddItem.bundleName && itemInfo.appIndex === newAddItem.appIndex;
    });

    if (idxPt >= 0) {
      this.mAppGridLayoutItemList[newAddItem.page].pageInfo[idxPt].isUninstallAble = newAddItem.isUninstallAble;
      this.mAppGridLayoutItemList[newAddItem.page].pageInfo[idxPt].appStatus = newAddItem.appStatus;
      this.mAppGridLayoutItemList[newAddItem.page].pageInfo[idxPt].abilityName = newAddItem.abilityName;
      this.mAppGridLayoutItemList[newAddItem.page].pageInfo[idxPt].moduleName = newAddItem.moduleName;
      this.mAppGridLayoutItemList[newAddItem.page].pageInfo[idxPt].appIndex = newAddItem.appIndex;
      this.mAppGridLayoutItemList[newAddItem.page].pageInfo[idxPt].appLabelId = newAddItem.appLabelId;
      this.mAppGridLayoutItemList[newAddItem.page].pageInfo[idxPt].appIconId = newAddItem.appIconId;
      this.mAppGridLayoutItemList[newAddItem.page].pageInfo[idxPt].applicationLabelId = newAddItem.applicationLabelId;
      this.mAppGridLayoutItemList[newAddItem.page].pageInfo[idxPt].keyName = newAddItem.keyName;
      log.showInfo(`handle portrait app data-${newAddItem.appStatus}-${this.mAppGridLayoutItemList[newAddItem.page].pageInfo[idxPt].appStatus}`);
    } else {
      if (FoldedDeviceAcViewModel.getInstance().isUnFoldedHorizontal()) {
        let r2 = newAddItem.row;
        let c2 = newAddItem.column;
        let idx2 = (r2 ?? 0) * FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_HORIZONTAL_GRID_COLUMNS + (c2 ?? 0);
        let newItem2 = ObjectCopyUtil.deepClone(newAddItem, new AppItemInfo());
        newItem2.row = Math.floor(idx2 / FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_GRID_COLUMNS);
        newItem2.column = idx2 % FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_GRID_COLUMNS;
        this.mAppGridLayoutItemList[newAddItem.page].pageInfo.push(newItem2);
        log.showInfo(`updateAppPageList add new item to pt-${idx2}-${r2}-${c2}-${newItem2.row}-${newItem2.column}-${newItem2.isUninstallAble}-${newAddItem.isUninstallAble}`);
      } else {
        log.showInfo('add new item strait to pt list');
        this.mAppGridLayoutItemList[newAddItem.page].pageInfo.push(newAddItem);
      }
    }
  }

  public addBlankPage(): boolean {
    let result = super.addBlankPage();
    if (result) {
      if (this.mAppPageListForLandscape.length > 0) {
        this.mAppPageListForLandscape.push({
          pageInfo: [],
          index: this.mAppPageListForLandscape.length,
          packageChangeTime: 0,
          forLandscape: true
        });
      } else {
        log.showInfo('addBlankPage ignore empty landscape app list');
      }
    }
    return result;
  }

  public putAppItemToGrid(appLayoutInfos: AppLayoutInfo[]): void {
    super.putAppItemToGrid(appLayoutInfos);
    if (this.mGridStyleConfig.mColumns > FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_GRID_COLUMNS) {
      appLayoutInfos.forEach((page: AppLayoutInfo) => {
        page.forLandscape = true;
      });
    }
  }

  public updateAppInstallStatus(item: AppItemInfo): void {
    if (this.mAppPageListForLandscape.length === 0) {
      return;
    }

    if (item.page === undefined || item.page >= this.mAppGridLayoutItemList.length) {
      log.showWarn('updateAppInstallStatus page index invalid');
      return;
    }

    let portItem = this.mAppGridLayoutItemList[item.page].pageInfo.find(app => {
      return item.appIndex === app.appIndex && item.bundleName === app.bundleName;
    });

    if (portItem) {
      log.showInfo(`updateAppInstallStatus p to ${item.appStatus}`);
      portItem.appStatus = item.appStatus;
    }

    if (item.page >= this.mAppPageListForLandscape.length) {
      log.showWarn('updateAppInstallStatus page index invalid exceed landscape pages');
      return;
    }

    let lsAppItem = this.mAppPageListForLandscape[item.page].pageInfo.find(app => {
      return item.appIndex === app.appIndex && item.bundleName === app.bundleName;
    });

    if (lsAppItem) {
      log.showInfo(`updateAppInstallStatus l to ${item.appStatus}`);
      lsAppItem.appStatus = item.appStatus;
    }
  }

  public deleteCachedLayoutItem(bundleName: string, isOperateDb: boolean = true, appIndex: number = 0): boolean {
    let mRows: number = FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_GRID_ROWS;
    let mColumns: number = FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_GRID_COLUMNS;
    let result = super.deleteCachedLayoutItem(bundleName, isOperateDb, appIndex, mRows, mColumns);
    mRows = FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_HORIZONTAL_GRID_ROWS;
    mColumns = FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_HORIZONTAL_GRID_COLUMNS;
    log.showInfo(`deleteCachedLayoutItem2-${result}`);

    if (!result) {
      return result;
    }

    if (this.mAppPageListForLandscape.length === 0) {
      return result;
    }

    this.mAppPageListForLandscape.forEach((page: AppLayoutInfo) => {
      let itemIndex: number = page.pageInfo?.findIndex((itemInfo: AppItemInfo) => {
        return itemInfo.bundleName === bundleName && itemInfo.appIndex === appIndex;
      });

      if (itemIndex > -1) {
        let item = page.pageInfo[itemIndex];
        for (let i = itemIndex + 1; i < page.pageInfo.length; i++) {
          const nextPos: number[] | undefined =
            this.getNextPosition(true, page.pageInfo[i].row, page.pageInfo[i].column, undefined, mRows, mColumns);
          page.pageInfo[i].page = item.page;
          page.pageInfo[i].row = nextPos ? nextPos[0] : page.pageInfo[i].row;
          page.pageInfo[i].column = nextPos ? nextPos[1] : page.pageInfo[i].column;
        }

        log.showInfo(`deleteCachedLayoutItem2-${bundleName}-${itemIndex}`);
        page.pageInfo.splice(itemIndex, 1);
      }
    });

    let pageChangedApps: AppItemInfo[] = [];
    this.checkBlankPagesAndDelete(pageChangedApps, this.mAppPageListForLandscape);
    if (FoldedDeviceAcViewModel.getInstance().isUnFoldedHorizontal()) {
      super.deleteBlankPage(this.mAppGridLayoutItemList);
    }

    return result;
  }

  /**
   * HPR-删除空白页
   * @returns
   */
  public deleteBlankPage(dataSource?: AppLayoutInfo[]): boolean {
    log.showInfo('deleteBlankPage-hpr');
    const retForLandscape: boolean = super.deleteBlankPage(this.mAppPageListForLandscape);
    const ret: boolean = super.deleteBlankPage(this.mAppGridLayoutItemList);
    return retForLandscape || ret;
  }

  public getAppGridLayoutItemList(clone: boolean = true): AppLayoutInfo[] {
    log.showInfo('getAppGridLayoutItemList');
    if (clone) {
      if (FoldedDeviceAcViewModel.getInstance().isUnFoldedHorizontal()) {
        log.showInfo(`getAppGridLayoutItemList2-${this.mAppPageListForLandscape.length}`);
        return this.deepCloneAppList(this.mAppPageListForLandscape);
      } else {
        return this.deepCloneAppList(this.mAppGridLayoutItemList);
      }
    } else {
      if (FoldedDeviceAcViewModel.getInstance().isUnFoldedHorizontal()) {
        return this.mAppPageListForLandscape;
      } else {
        return this.mAppGridLayoutItemList;
      }
    }
  }

  private doReorderAppsToLandscape(): void {
    this.mAppPageListForLandscape.forEach((page: AppLayoutInfo) => {
      page.pageInfo.forEach((item: AppItemInfo) => {
        let oldRow = item.row;
        let oldCol = item.column;
        let idx = (oldRow ?? 0) * FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_GRID_COLUMNS +
          (oldCol ?? 0);

        item.row = Math.floor(idx / FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_HORIZONTAL_GRID_COLUMNS);
        item.column = idx % FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_HORIZONTAL_GRID_COLUMNS;
        log.showInfo(`doReorderAppsToLandscape-${oldRow}-${oldCol}-${item.page}-${idx}-${item.row}-${item.column}`);
      });

      page.forLandscape = true;
    });
  }

  private doReorderAppsToPortrait(): void {
    this.mAppGridLayoutItemList.forEach((page: AppLayoutInfo) => {
      page.pageInfo.forEach((item: AppItemInfo) => {
        let oldRow = item.row;
        let oldCol = item.column;
        let idx = (oldRow ?? 0) *
        FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_HORIZONTAL_GRID_COLUMNS + (oldCol ?? 0);

        item.row = Math.floor(idx / FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_GRID_COLUMNS);
        item.column = idx % FoldAcGridLayoutConstants.DEFAULT_HPR_APP_CENTER_GRID_COLUMNS;
        log.showInfo(`doReorderAppsToPortrait-${oldRow}-${oldCol}-${item.page}-${idx}-${item.row}-${item.column}`);
      });

      page.forLandscape = false;
    });
  }

  /**
   * 排序指定页面h
   */
  public sortAllData(pageIndex?: number[]): void {
    log.showInfo(`folded start to sort all Data`);
    if (pageIndex) {
      this.mAppGridLayoutItemList?.forEach((pageData: AppLayoutInfo) => {
        if (pageIndex.includes(pageData.index)) {
          this.sortPageData(pageData?.pageInfo);
        }
      });

      this.mAppPageListForLandscape?.forEach((pageData: AppLayoutInfo) => {
        if (pageIndex.includes(pageData.index)) {
          this.sortPageData(pageData?.pageInfo);
        }
      });
    } else {
      this.mAppGridLayoutItemList?.forEach((pageData: AppLayoutInfo) => {
        this.sortPageData(pageData?.pageInfo);
      });

      this.mAppPageListForLandscape?.forEach((pageData: AppLayoutInfo) => {
        this.sortPageData(pageData?.pageInfo);
      });
    }
  }


  public beyondOneScreen(pages: number): boolean {
    const fs: SCBFoldedState = FoldedDeviceAcViewModel.getInstance().getCurrentFoldState();
    switch (fs) {
      case SCBFoldedState.HALF_FOLDED_VIRTUAL_KEYBOARD:
      case SCBFoldedState.HALF_FOLDED_PHYSICAL_KEYBOARD:
        return super.beyondOneScreen(pages);
      default :
        return pages > PAGES_IN_ONE_SCREEN;
    }
  }
}