/*
 * Copyright (c) Huawei Technologies 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 relationalStore from '@ohos.data.relationalStore';
import { BusinessError } from '@ohos.base';
import { LogUtil } from '../utils/LogUtil';
import DatabaseManager from './DatabaseManager';
import {
  ISVISIBLE_FALSE,
  ISVISIBLE_TRUE,
  PageInfo,
  PAGEINFO_TABLE,
  SQL_CREATE_PAGEINFO_TABLE,
  SQL_DELETE_PAGEINFO_TABLE
} from './types';
import { HiSysEventUtil } from '../systemEvent/HiSysEventUtil';
import { RdbTaskPool } from '../rdb/RdbTaskPool';
import { HiSysRdbEventGroup } from '../systemEvent/BehaviorEventConsts';

const TAG: string = 'SettingPageDescManager';
const RDB_CORRUPTION_ERROR_CODE: number = 14800011;

export class SettingPageDescManager extends DatabaseManager {
  /**
   * 获取关系数据库存储对象
   * 如果已初始化过,则直接返回之前获取的对象
   * 如果没有初始化过,则使用接口获取对象,并执行数据库建表命令,如果表未创建,则会创建一张新的表
   *
   * @return 关系数据库存储对象
   */
  async getRdbStore(): Promise<relationalStore.RdbStore> {
    const rdbStore = await super.getRdbStore(SQL_CREATE_PAGEINFO_TABLE);
    return rdbStore;
  }

  async clearPageInfoData(): Promise<void> {
    const rdbStore = await this.getRdbStore();
    try {
      await rdbStore.executeSql(SQL_DELETE_PAGEINFO_TABLE);
      LogUtil.info(`${TAG} clearPageinfoData successfully.`);
      HiSysEventUtil.searchReportEvent(TAG, 'clearPageinfoData success');
    } catch (error) {
      LogUtil.error(`${TAG} clearPageinfoData failed, message: ${error?.message}, code: ${error?.code}`);
      HiSysEventUtil.searchReportEvent(TAG, `clearPageinfoData error: ${JSON.stringify(error)}`);
      if (error.code === RDB_CORRUPTION_ERROR_CODE) {
        HiSysEventUtil.reportDefaultFaultEvent(HiSysRdbEventGroup.EVENT_NAME,
          HiSysRdbEventGroup.SETTINGS_DATA_RDB_CORRUPTION);
        await super.restoreRdb();
      }
    }
  }

  /**
   * 设置页描述信息批量插入PageInfo表
   * @return
   */
  async batchInsertPageInfoData(pageInfos: Array<PageInfo>): Promise<void> {
    try {
      LogUtil.info(`${TAG} start batchInsertPageInfoData`);
      let pageInfoList: relationalStore.ValuesBucket[] = [];
      pageInfos.forEach((pageInfo) => {
        pageInfoList.push(this.getDbBucketList(pageInfo));
      })
      LogUtil.info(`${TAG} batchInsertPageInfoData beginTransaction pageInfoList:  ${pageInfoList?.length}`);
      let result = await RdbTaskPool.getInstance().batchInsert(PAGEINFO_TABLE, pageInfoList);
      LogUtil.info(`${TAG} batchInsertPageInfoData result: ${result}`);
    } catch (error) {
      LogUtil.error(`${TAG} batchInsertPageInfoData error, message: ${error?.message}, code: ${error?.code}`);
      HiSysEventUtil.searchReportEvent(TAG, `batchInsertPageInfoData error: ${JSON.stringify(error)}`);
      if (error.code === RDB_CORRUPTION_ERROR_CODE) {
        HiSysEventUtil.reportDefaultFaultEvent(HiSysRdbEventGroup.EVENT_NAME,
          HiSysRdbEventGroup.SETTINGS_DATA_RDB_CORRUPTION);
        await super.restoreRdb();
      }
    }
  }

  private getDbBucketList(pageInfo: PageInfo): relationalStore.ValuesBucket {
    return {
      'entryKey': pageInfo.entryKey,
      'parentKey': pageInfo.parentKey,
      'isVisible': pageInfo.isVisible ? ISVISIBLE_TRUE : ISVISIBLE_FALSE,
      'permission': pageInfo.permission,
    }
  }
}

export default new SettingPageDescManager();