import { relationalStore, ValuesBucket } from '@kit.ArkData'
import { ITaskItem } from '../models/Task'

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

  // 获取数据库操作的实例
  async getStoreInstance() {
    // 如果数据库实例已存在，直接返回，没有才创建实例
    if (this.store) { return this.store }
    // 获取操作数据库的实例
    const store = await relationalStore.getRdbStore(getContext(), {
      name: 'Task.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: ITaskItem) {
    //获取操作数据库的对象
    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: ITaskItem[] = []
    while (resultSet.goToNextRow()) {
      // 获取行数据
      const row = resultSet.getRow() as ITaskItem
      // 追加到数组中
      list.push(row)
    }
    // 循环结束，释放结果集的内存空间（性能优化）
    resultSet.close()
    // 循环结束后，返回结果
    return list
  }

  // 更新
  //在更新的时候，不是所有要必传，就要用工具把必选改为可选
  async update(item: Partial<ITaskItem>) {
    // 如果没有 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 taskItemDB = new TaskItemDB()

