import { huanzheDb } from '@itcast/basic';
import { Huanzhelast444Model } from '@itcast/basic';
import common from '@ohos.app.ability.common';
import fs from '@ohos.file.fs';
import relationalStore from '@ohos.data.relationalStore';

export interface Huanzhelast444Result {
  code: number; // 0: 成功, 1: 文件不存在, 2: 表不存在, 3: 其它错误
  msg: string;
  data?: Huanzhelast444Model[];
}

export class Huanzhelast444Dao {
  /**
   * 获取所有患者数据，并检查数据库文件和表是否存在。
   * @param context 应用上下文
   * @returns Huanzhelast444Result
   */
  // static async getAll(context: common.Context): Promise<Huanzhelast444Result> {
  //   console.info('getAll called');
  //   const dbFileName = 'huanzhelas.sqlite';
  //   const dbPath = context.filesDir + '/' + dbFileName;
  //   // 1. 检查数据库文件是否存在
  //   let fileExists = false;
  //   try {
  //     fileExists = fs.accessSync(dbPath);
  //   } catch (e) {
  //     fileExists = false;
  //   }
  //   // 2. 如不存在则尝试复制
  //   if (!fileExists) {
  //     try {
  //       const resourceMgr = context.resourceManager;
  //       const rawFile = await resourceMgr.getRawFileContent(dbFileName);
  //       const arrayBuffer = rawFile.buffer;
  //       // 确保目录存在
  //       try { fs.accessSync(context.filesDir); } catch (e) { fs.mkdirSync(context.filesDir); }
  //       // 复制前删除旧文件
  //       if (fs.accessSync(dbPath)) {
  //         fs.unlinkSync(dbPath);
  //       }
  //       // 复制数据库文件（确保完整写入）
  //       const file = fs.openSync(dbPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
  //       const buffer = new Uint8Array(arrayBuffer);
  //       fs.writeSync(file.fd, buffer, 0, buffer.length);
  //       fs.closeSync(file);
  //       // 复制后校验文件大小
  //       const stat = fs.statSync(dbPath);
  //       console.info('数据库文件大小:', stat.size, '原始大小:', buffer.length);
  //       fs.accessSync(dbPath); // 再次检查
  //       fileExists = true;
  //     } catch (e) {
  //       return { code: 1, msg: '数据库文件移动失败: ' + e };
  //     }
  //   }
  //   // 3. 初始化数据库并查询
  //   try {
  //     await huanzheDb.initDatabase(context);
  //     // 直接用 helper 的查询方法
  //     const rawList = await huanzheDb.queryHuanzhelastData() as Partial<Huanzhelast444Model>[];
  //     // 用 Huanzhelast444Model 构造实例数组
  //     const dataList: Huanzhelast444Model[] = rawList.map((item) => new Huanzhelast444Model(
  //       item._id ?? 0,
  //       item.id ?? 0,
  //       item.fullname ?? '',
  //       item.name ?? '',
  //       item.parent ?? 0,
  //       item.treePath ?? ''
  //     ));
  //     console.info('getAll return:', JSON.stringify({ code: 0, msg: '查询成功', data: dataList }));
  //     return { code: 0, msg: '查询成功', data: dataList };
  //   } catch (e) {
  //     // 判断表不存在的情况
  //     if (typeof e === 'string' && e.indexOf('no such table') !== -1) {
  //       return { code: 2, msg: '表 t_huanzhelast444 不存在' };
  //     }
  //     return { code: 3, msg: '数据查询失败: ' + e };
  //   }
  // }

  /**
   * 直接独立实现：获取所有患者数据，判断文件移动、表存在、数据查询。
   * @param context 应用上下文
   * @returns Huanzhelast444Result
   */
  static async getAllDirect(context: common.Context): Promise<Huanzhelast444Result> {
    const dbFileName = 'huanzhelas.sqlite';
    const dbPath = context.databaseDir + '/' + dbFileName;
    // 1. 检查数据库文件是否存在
    let fileExists = fs.accessSync(dbPath);

    // 2. 如不存在则尝试复制
    if (!fileExists) {
      try {
        const resourceMgr = context.resourceManager;
        const rawFile = await resourceMgr.getRawFileContent(dbFileName);
        const arrayBuffer = rawFile.buffer;
        // 确保目录存在
        try { fs.accessSync(context.databaseDir); } catch (e) { fs.mkdirSync(context.databaseDir); }
        // 复制前删除旧文件
        if (fs.accessSync(dbPath)) {
          fs.unlinkSync(dbPath);
        }
        // 复制数据库文件（确保完整写入）
        const file = fs.openSync(dbPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
        const buffer = new Uint8Array(arrayBuffer);
        fs.writeSync(file.fd, buffer); // offset=0, length=buffer.length
        fs.closeSync(file);
        // 复制后校验文件大小
        const stat = fs.statSync(dbPath);
        console.info('数据库文件大小:', stat.size, '原始大小:', buffer.length);
        fileExists = true;
      } catch (e) {
        return { code: 1, msg: '数据库文件移动失败: ' + e } as Huanzhelast444Result;
      }
    }
    // 3. 用 relationalStore 直接操作数据库
    let rdbStore: relationalStore.RdbStore | null = null;
    try {
      const storeConfig: relationalStore.StoreConfig = { name: dbFileName, securityLevel: relationalStore.SecurityLevel.S1 };
      rdbStore = await relationalStore.getRdbStore(context, storeConfig);
    } catch (e) {
      return { code: 1, msg: '数据库文件打开失败: ' + e } as Huanzhelast444Result;
    }
    // 4. 检查表是否存在
    try {
      // 复制后，打印所有表名
      const resultSet = await rdbStore.querySql("SELECT name FROM sqlite_master WHERE type='table'", []);
      if (resultSet.rowCount > 0) {
        resultSet.goToFirstRow();
        do {
          console.info('数据库中存在的表:', resultSet.getString(0));
        } while (resultSet.goToNextRow());
      }
      resultSet.close();
      // const resultSet = await rdbStore.querySql("SELECT name FROM sqlite_master WHERE type='table' AND name='t_huanzhelast444'", []);
      // let hasTable = false;
      // if (resultSet.rowCount > 0) {
      //   resultSet.goToFirstRow();
      //   do {
      //     if (resultSet.getString(0) === 't_huanzhelast444') {
      //       hasTable = true;
      //       break;
      //     }
      //   } while (resultSet.goToNextRow());
      // }
      // resultSet.close();
      // if (!hasTable) {
      //   return { code: 2, msg: '表 t_huanzhelast444 不存在' } as Huanzhelast444Result;
      // }
    } catch (e) {
      return { code: 3, msg: '表检查失败: ' + e } as Huanzhelast444Result;
    }
    // 5. 查询所有数据
    try {
      const resultSet = await rdbStore.querySql('SELECT _id, id, fullname, name, parent, treePath FROM t_huanzhelast444', []);
      const dataList: Huanzhelast444Model[] = [];
      if (resultSet.rowCount > 0) {
        resultSet.goToFirstRow();
        do {
          dataList.push(new Huanzhelast444Model(
            resultSet.getDouble(0),
            resultSet.getDouble(1),
            resultSet.getString(2),
            resultSet.getString(3),
            resultSet.getDouble(4),
            resultSet.getString(5)
          ));
        } while (resultSet.goToNextRow());
      }
      resultSet.close();
      return { code: 0, msg: '查询成功', data: dataList } as Huanzhelast444Result;
    } catch (e) {
      return { code: 3, msg: '数据查询失败: ' + e } as Huanzhelast444Result;
    }
  }
}
