/*
 * 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 GridLayoutInfoColumns from '../db/column/GridLayoutInfoColumns';
import GridLayoutItemInfoDataBase from './GridLayoutItemInfoDataBase';
import type GridLayoutItemInfo from './GridLayoutItemInfoDataBase';
import type rdb from '@ohos.data.relationalStore';
import GridLayoutItemBuilder from '../bean/GridLayoutItemBuilder';

/**
 * Item info of GridLayoutInfo item builder
 */
export default class GridLayoutItemDbBuilder {
  /**
   * GridLayoutInfo: id 主键
   */
  public id: number | undefined;

  /**
   * GridLayoutInfo: info id 元素标识id
   */
  public infoId: string | undefined;

  /**
   * GridLayoutInfo: info name 元素名称
   */
  public infoName: string | undefined;

  /**
   * GridLayoutInfo: uri
   */
  public uri: string | undefined;

  /**
   * GridLayoutInfo: Unique identifier of file
   */
  public ino: string | undefined;

  /**
   * GridLayoutInfo: type of file
   */
  public fileType: number | undefined;

  /**
   * GridLayoutInfo: bigfolder id 元素所在位置(工作区,Dock区,文件夹)
   * Not in bigfolder: - 100
   * In a bigfolder: ID of the bigfolder.
   */
  public container: number | undefined;

  /**
   * GridLayoutInfo: type id 元素类型
   */
  public typeId: number | undefined;

  /**
   * GridLayoutInfo: width 网格内所占列数
   */
  public width: number | undefined;

  /**
   * GridLayoutInfo: height 网格内所占行数
   */
  public height: number | undefined;

  /**
   * GridLayoutInfo: page index 桌面页数索引(0 ~ n-1)
   */
  public pageIndex: number | undefined;

  /**
   * GridLayoutInfo: column of positions 网格上起始列
   */
  public column: number | undefined;

  /**
   * GridLayoutInfo: row of positions 网格上起始行
   */
  public row: number | undefined;

  /**
   * for lazy rotate
   */
  public portraitPageIndex: number | undefined;

  /**
   * for lazy rotate
   */
  public portraitColumn: number | undefined;

  /**
   * for lazy rotate
   */
  public portraitRow: number | undefined;

  /**
   * for lazy rotate
   */
  public portraitWidth: number | undefined;

  /**
   * for lazy rotate
   */
  public portraitHeight: number | undefined;

  /**
   * for lazy rotate
   */
  public landscapePageIndex: number | undefined;

  /**
   * for lazy rotate
   */
  public landscapeColumn: number | undefined;

  /**
   * for lazy rotate
   */
  public landscapeRow: number | undefined;

  /**
   * for lazy rotate
   */
  public landscapeWidth: number | undefined;

  /**
   * for lazy rotate
   */
  public landscapeHeight: number | undefined;

  /**
   * GridLayoutInfo bundle name. 包名
   */
  public bundleName: string | undefined;

  /**
   * GridLayoutInfo module name. 模块名
   */
  public moduleName: string | undefined;

  /**
   * GridLayoutInfo ability name. Ability名称
   */
  public abilityName: string | undefined;

  /**
   * GridLayoutInfo: app icon id 应用图标id
   */
  public appIconId: number | undefined;

  /**
   * GridLayoutInfo: app label id 应用label id
   */
  public appLabelId: number | undefined;

  /**
   * GridLayoutInfo icon resource.
   */
  public iconResource: string | undefined;

  /**
   * GridLayoutInfo layout info. 子布局:大文件夹中包含的app信息
   */
  public layoutInfo: GridLayoutItemInfo[] | undefined;

  /**
   * GridLayoutItemInfo: row of positons
   */
  public kindId: number | undefined;

  /**
   * GridLayoutInfo: extend1
   */
  public extend1: string | undefined;

  /**
   * GridLayoutInfo: extend2
   */
  public extend2: string | undefined;

  /**
   * GridLayoutInfo: user id 用户id
   */
  public userId: number | undefined;

  /**
   * GridLayoutInfo: download progress 下载进度
   */
  public downloadProgress: number | undefined;

  /**
   * GridLayoutInfo: app status 应用状态(下载中、暂停等)
   */
  public appStatus: number | undefined;

  /**
   * 任务创建者的名字
   */
  public callerName?: string | undefined;

  /**
   * GridLayoutInfo: appIndex 应用分身id
   */
  public appIndex: number | undefined;

  /**
   * GridLayoutInfo: shortcutId 快捷方式id
   */
  public shortcutId?: string;

  /**
   * GridLayoutInfo: intent 特殊应用标识
   */
  public intent?: string;

  /**
   * GridLayoutInfo: size of file/folder
   */
  public size: number | undefined;

  /**
   * GridLayoutInfo: Create time of file/folder
   */
  public ctime: number | undefined;

  /**
   * GridLayoutInfo: Modification time of file/folder
   */
  public mtime: number | undefined;

  public screenId?: number | undefined;

  public targetFormData?: string | undefined;

  constructor(id: number) {
    this.id = id;
  }

  static fromResultSet(resultSet: rdb.ResultSet): GridLayoutItemDbBuilder {
    let gridlayoutItemBuilder = new GridLayoutItemDbBuilder(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.ID)));
    gridlayoutItemBuilder.setInfoId(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.INFO_ID)));
    gridlayoutItemBuilder.setInfoName(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.INFO_NAME)));
    gridlayoutItemBuilder.setUri(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.URI)));
    gridlayoutItemBuilder.setIno(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.FILE_INO)));
    gridlayoutItemBuilder.setFileType(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.FILE_TYPE)));
    gridlayoutItemBuilder.setContainer(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.CONTAINER)));
    gridlayoutItemBuilder.setTypeId(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.TYPE_ID)));
    gridlayoutItemBuilder.setWidth(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.WIDTH)));
    gridlayoutItemBuilder.setHeight(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.HEIGHT)));
    gridlayoutItemBuilder.setPageIndex(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.PAGE_INDEX)));
    gridlayoutItemBuilder.setColumn(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.COLUMN)));
    gridlayoutItemBuilder.setRow(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.ROW)));
    gridlayoutItemBuilder.setBundleName(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.BUNDLE_NAME)));
    gridlayoutItemBuilder.setModuleName(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.MODULE_NAME)));
    gridlayoutItemBuilder.setAbilityName(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.ABILITY_NAME)));
    gridlayoutItemBuilder.setAppIconId(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.APP_ICON_ID)));
    gridlayoutItemBuilder.setAppLabelId(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.APP_LABEL_ID)));
    gridlayoutItemBuilder.setIconResource(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.ICON_RESOURCE)));
    gridlayoutItemBuilder.setKindId(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.KIND_ID)));
    gridlayoutItemBuilder.setExtend1(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.EXTEND1)));
    gridlayoutItemBuilder.setExtend2(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.EXTEND2)));
    gridlayoutItemBuilder.setUserId(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.USER_ID)));
    gridlayoutItemBuilder.setDownloadProgress(resultSet.getDouble(resultSet.getColumnIndex(GridLayoutInfoColumns.DOWNLOAD_PROGRESS)));
    gridlayoutItemBuilder.setAppStatus(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.APP_STATUS)));
    gridlayoutItemBuilder.setCallerName(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.CALLER_NAME)));
    gridlayoutItemBuilder.setAppIndex(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.APP_INDEX)));
    gridlayoutItemBuilder.setShortcutId(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.SHORTCUT_ID)));
    gridlayoutItemBuilder.setIntent(resultSet.getString(resultSet.getColumnIndex(GridLayoutInfoColumns.INTENT)));
    let filSizeIndex: number = GridLayoutItemDbBuilder.getColumnIndex(resultSet, GridLayoutInfoColumns.FILE_SIZE);
    if (filSizeIndex > 0) {
      gridlayoutItemBuilder.setSize(resultSet.getLong(filSizeIndex));
      gridlayoutItemBuilder.setCtime(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.FILE_CREATE_TIME)));
      gridlayoutItemBuilder.setMtime(resultSet.getLong(resultSet.getColumnIndex(GridLayoutInfoColumns.FILE_MODIFICATION_TIME)));
    } else {
      gridlayoutItemBuilder.setSize(0);
      gridlayoutItemBuilder.setCtime(0);
      gridlayoutItemBuilder.setMtime(0);
    }
    let targetFormDataIndex: number = GridLayoutItemDbBuilder.getColumnIndex(resultSet, GridLayoutInfoColumns.TARGET_FORM_DATA);
    if (targetFormDataIndex > 0) {
      gridlayoutItemBuilder.setTargetFormData(resultSet.getString(targetFormDataIndex));
    } else {
      gridlayoutItemBuilder.setTargetFormData('');
    }
    let portraitPage: number = resultSet.getColumnIndex(GridLayoutInfoColumns.PORTRAIT_PAGE_INDEX);
    let portraitColumn: number = resultSet.getColumnIndex(GridLayoutInfoColumns.PORTRAIT_COLUMN);
    let portraitRow: number = resultSet.getColumnIndex(GridLayoutInfoColumns.PORTRAIT_ROW);
    let portraitWidth: number = resultSet.getColumnIndex(GridLayoutInfoColumns.PORTRAIT_WIDTH);
    let portraitHeight: number = resultSet.getColumnIndex(GridLayoutInfoColumns.PORTRAIT_HEIGHT);
    let landscapePage: number = resultSet.getColumnIndex(GridLayoutInfoColumns.LANDSCAPE_PAGE_INDEX);
    let landscapeColumn: number = resultSet.getColumnIndex(GridLayoutInfoColumns.LANDSCAPE_COLUMN);
    let landscapeRow: number = resultSet.getColumnIndex(GridLayoutInfoColumns.LANDSCAPE_ROW);
    let landscapeWidth: number = resultSet.getColumnIndex(GridLayoutInfoColumns.LANDSCAPE_WIDTH);
    let landscapeHeight: number = resultSet.getColumnIndex(GridLayoutInfoColumns.LANDSCAPE_HEIGHT);
    let screenId: number = resultSet.getColumnIndex(GridLayoutInfoColumns.SCREEN_ID);
    gridlayoutItemBuilder.setPortraitPageIndex(portraitPage > 0 ? resultSet.getLong(portraitPage) : NaN);
    gridlayoutItemBuilder.setPortraitColumn(portraitColumn > 0 ? resultSet.getLong(portraitColumn) : NaN);
    gridlayoutItemBuilder.setPortraitRow(portraitRow > 0 ? resultSet.getLong(portraitRow) : NaN);
    gridlayoutItemBuilder.setPortraitWidth(portraitWidth > 0 ? resultSet.getLong(portraitWidth) : NaN);
    gridlayoutItemBuilder.setPortraitHeight(portraitHeight > 0 ? resultSet.getLong(portraitHeight) : NaN);
    gridlayoutItemBuilder.setLandscapePageIndex(landscapePage > 0 ? resultSet.getLong(landscapePage) : NaN);
    gridlayoutItemBuilder.setLandscapeColumn(landscapeColumn > 0 ? resultSet.getLong(landscapeColumn) : NaN);
    gridlayoutItemBuilder.setLandscapeRow(landscapeRow > 0 ? resultSet.getLong(landscapeRow) : NaN);
    gridlayoutItemBuilder.setLandscapeWidth(landscapeWidth > 0 ? resultSet.getLong(landscapeWidth) : NaN);
    gridlayoutItemBuilder.setLandscapeHeight(landscapeHeight > 0 ? resultSet.getLong(landscapeHeight) : NaN);
    gridlayoutItemBuilder.setScreenId(screenId > 0 ? resultSet.getLong(screenId) : NaN);
    return gridlayoutItemBuilder;
  }

  static getColumnIndex(resultSet: rdb.ResultSet, columnName: string):number {
    let index: number = -1;
    try {
      index = resultSet?.getColumnIndex(columnName);
    } catch (error) {
      index = -1;
    }
    return index;
  }

  public setInfoId(infoId: string | undefined): GridLayoutItemDbBuilder {
    this.infoId = infoId;
    return this;
  }

  public setInfoName(infoName: string | undefined): GridLayoutItemDbBuilder {
    this.infoName = infoName;
    return this;
  }

  public setUri(uri: string | undefined): GridLayoutItemDbBuilder {
    this.uri = uri;
    return this;
  }

  public setIno(ino: string | undefined): GridLayoutItemDbBuilder {
    this.ino = ino;
    return this;
  }

  public setFileType(fileType: number | undefined): GridLayoutItemDbBuilder {
    this.fileType = fileType;
    return this;
  }

  public setContainer(container: number | undefined): GridLayoutItemDbBuilder {
    this.container = container;
    return this;
  }

  public setTypeId(typeId: number | undefined): GridLayoutItemDbBuilder {
    this.typeId = typeId;
    return this;
  }

  public setWidth(width: number): GridLayoutItemDbBuilder {
    this.width = width;
    return this;
  }

  public setHeight(height: number): GridLayoutItemDbBuilder {
    this.height = height;
    return this;
  }

  public setPageIndex(pageIndex: number | undefined): GridLayoutItemDbBuilder {
    this.pageIndex = pageIndex;
    return this;
  }

  public setColumn(column: number | undefined): GridLayoutItemDbBuilder {
    this.column = column;
    return this;
  }

  public setRow(row: number | undefined): GridLayoutItemDbBuilder {
    this.row = row;
    return this;
  }

  public setPortraitPageIndex(pageIndex: number | undefined): GridLayoutItemDbBuilder {
    this.portraitPageIndex = pageIndex;
    return this;
  }

  public setPortraitColumn(column: number | undefined): GridLayoutItemDbBuilder {
    this.portraitColumn = column;
    return this;
  }

  public setPortraitRow(row: number | undefined): GridLayoutItemDbBuilder {
    this.portraitRow = row;
    return this;
  }

  public setPortraitWidth(width: number): GridLayoutItemDbBuilder {
    this.portraitWidth = width;
    return this;
  }

  public setPortraitHeight(height: number): GridLayoutItemDbBuilder {
    this.portraitHeight = height;
    return this;
  }

  public setLandscapePageIndex(pageIndex: number | undefined): GridLayoutItemDbBuilder {
    this.landscapePageIndex = pageIndex;
    return this;
  }

  public setLandscapeColumn(column: number | undefined): GridLayoutItemDbBuilder {
    this.landscapeColumn = column;
    return this;
  }

  public setLandscapeRow(row: number | undefined): GridLayoutItemDbBuilder {
    this.landscapeRow = row;
    return this;
  }

  public setLandscapeWidth(width: number): GridLayoutItemDbBuilder {
    this.landscapeWidth = width;
    return this;
  }

  public setLandscapeHeight(height: number): GridLayoutItemDbBuilder {
    this.landscapeHeight = height;
    return this;
  }

  public setBundleName(bundleName: string): GridLayoutItemDbBuilder {
    this.bundleName = bundleName;
    return this;
  }

  public setModuleName(moduleName: string | undefined): GridLayoutItemDbBuilder {
    this.moduleName = moduleName;
    return this;
  }

  public setAbilityName(abilityName: string): GridLayoutItemDbBuilder {
    this.abilityName = abilityName;
    return this;
  }

  public setAppIconId(appIconId: number): GridLayoutItemDbBuilder {
    this.appIconId = appIconId;
    return this;
  }

  public setAppLabelId(appLabelId: number | undefined): GridLayoutItemDbBuilder {
    this.appLabelId = appLabelId;
    return this;
  }

  public setIconResource(iconResource: string | undefined): GridLayoutItemDbBuilder {
    this.iconResource = iconResource;
    return this;
  }

  public setLayoutInfo(gridLayoutItemInfos: GridLayoutItemInfo[]): GridLayoutItemDbBuilder {
    this.layoutInfo = gridLayoutItemInfos;
    return this;
  }

  public setExtend1(extend1: string | undefined): GridLayoutItemDbBuilder {
    this.extend1 = extend1;
    return this;
  }

  public setKindId(kindId: number | undefined): GridLayoutItemDbBuilder {
    this.kindId = kindId;
    return this;
  }

  public setExtend2(extend2: string | undefined): GridLayoutItemDbBuilder {
    this.extend2 = extend2;
    return this;
  }

  public setUserId(userId: number): GridLayoutItemDbBuilder {
    this.userId = userId;
    return this;
  }

  public setDownloadProgress(progress: number): GridLayoutItemDbBuilder {
    this.downloadProgress = progress;
    return this;
  }

  public setAppStatus(status: number): GridLayoutItemDbBuilder {
    this.appStatus = status;
    return this;
  }

  public setCallerName(callerName: string | undefined): GridLayoutItemDbBuilder {
    this.callerName = callerName;
    return this;
  }

  public setAppIndex(appIndex: number): GridLayoutItemDbBuilder {
    this.appIndex = appIndex;
    return this;
  }

  public setShortcutId(shortcutId: string): GridLayoutItemDbBuilder {
    this.shortcutId = shortcutId;
    return this;
  }

  public setIntent(intent: string): GridLayoutItemDbBuilder {
    this.intent = intent;
    return this;
  }

  public setSize(size: number): GridLayoutItemDbBuilder {
    this.size = size;
    return this;
  }

  public setCtime(Ctime: number): GridLayoutItemDbBuilder {
    this.ctime = Ctime;
    return this;
  }

  public setMtime(Mtime: number): GridLayoutItemDbBuilder {
    this.mtime = Mtime;
    return this;
  }

  public setTargetFormData(targetFormData: string): GridLayoutItemDbBuilder {
    this.targetFormData = targetFormData;
    return this;
  }

  public setScreenId(screenId: number): GridLayoutItemDbBuilder {
    this.screenId = screenId;
    return this;
  }

  buildGridLayoutItemDB(): GridLayoutItemInfoDataBase {
    let info = new GridLayoutItemInfoDataBase();
    info.setInfo(this);
    return info;
  }
}