import { relationalStore, ValuesBucket } from '@kit.ArkData'
import { ITaskCategory } from '../models/TaskCategory'

// 隐私笔记数据库封装
class TaskCategoryDB {
  // 操作数据库的实例
  private store: relationalStore.RdbStore | null = null
  // 数据库表名
  private tableName = 'TaskCategoryDB'
  // 创建数据库的语句
  private sqlCreate = `CREATE TABLE IF NOT EXISTS ${this.tableName} (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        color TEXT NOT NULL
      )`

  // 获取数据库操作的实例
  async getStoreInstance() {
    // 如果数据库实例已存在，直接返回，没有才创建实例
    if (this.store) { return this.store }
    // 获取操作数据库的实例
    const store = await relationalStore.getRdbStore(getContext(), {
      name: 'TaskCategory.db', // 数据库名称
      securityLevel: relationalStore.SecurityLevel.S1 // 安全等级
    })
    // 存储起来方便下次直接获取
    this.store = store
    // 返回 store 实例
    return this.store
  }


  // 类的构造器，new 的时候会自动触发
  constructor() {
    // 创建/打开数据库文件
    this.getStoreInstance()
      .then(store => {
        // 执行创建语句，用于创建数据库的表
        store.executeSql(this.sqlCreate)
      })
  }

  // 新增
  async insert(item: ITaskCategory) {
    //获取操作数据库的对象
    const store = await this.getStoreInstance()
    return store.insert(this.tableName, item)
  }

  // 查询数量
  async queryCount() {
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    const resultSet = await store.query(predicates)
    return resultSet.rowCount > 0 ? resultSet.rowCount : 0
  }

  // 查询
  async query(id?: number) {
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    // 倒序排列
    predicates.orderByDesc('id')
    // 如果有 id，添加 id 作为查询条件
    if (id) {
      predicates.equalTo('id', id)
    }
    const resultSet = await store.query(predicates)
    const list: ITaskCategory[] = []
    while (resultSet.goToNextRow()) {
      // 获取行数据
      const row = resultSet.getRow() as ITaskCategory
      // 追加到数组中
      list.push(row)
    }
    // 循环结束，释放结果集的内存空间（性能优化）
    resultSet.close()
    // 循环结束后，返回结果
    return list
  }

  // 更新
  //在更新的时候，不是所有要必传，就要用工具把必选改为可选
  async update(item: Partial<ITaskCategory>) {
    // 如果没有 id 直接退出
    if (!item.id) { return Promise.reject('id error') }
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('id', item.id)
    // 更新完成，返回受影响的行数
    return store.update(item, predicates)
  }

  // 删除
  async delete(ids: number[]) {
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.in('id', ids)
    // 删除完成，返回受影响的行数
    return store.delete(predicates)
  }




}
export const taskCategoryDB = new TaskCategoryDB()

