import { getORM } from "@core/database";
import { DemoEntity } from "../../models/DemoEntity";
import { DemoLocalDataSource } from "./DemoLocalDataSource";

/**
 * @file Demo 数据源实现,基于 IBest-ORM 封装 CRUD。
 * @author Joker.X
 */
export class DemoLocalDataSourceImpl implements DemoLocalDataSource {
  /**
   * 迁移标记,避免重复建表
   */
  private static migrated: boolean = false;
  /**
   * ORM 实例
   */
  private orm = getORM();

  constructor() {
    this.ensureMigrated();
  }

  /**
   * 确保 Demo 表完成迁移
   * @returns {void} 无返回
   */
  private ensureMigrated(): void {
    if (!DemoLocalDataSourceImpl.migrated) {
      this.orm.migrate(DemoEntity);
      DemoLocalDataSourceImpl.migrated = true;
    }
  }

  /**
   * 新增一条 Demo 记录
   * @param {string} title - 标题
   * @param {string} description - 描述
   * @returns {Promise<number>} 新建记录主键
   */
  async createItem(title: string, description: string = ""): Promise<number> {
    const entity: DemoEntity = new DemoEntity();
    entity.title = title;
    entity.description = description;
    return this.orm.insert(entity);
  }

  /**
   * 更新 Demo 记录
   * @param {DemoEntity} entity - 待更新实体
   * @returns {Promise<void>} Promise<void>
   */
  async updateItem(entity: DemoEntity): Promise<void> {
    this.orm.save(entity);
  }

  /**
   * 按主键删除 Demo 记录
   * @param {number} id - 记录主键
   * @returns {Promise<void>} Promise<void>
   */
  async deleteById(id: number): Promise<void> {
    this.orm.deleteById(DemoEntity, id);
  }

  /**
   * 清空 Demo 表
   * @returns {Promise<number>} 受影响行数
   */
  async clearAll(): Promise<number> {
    return this.orm.query(DemoEntity).delete();
  }

  /**
   * 查询全部 Demo 记录并按更新时间倒序
   * @returns {Promise<DemoEntity[]>} Demo 列表
   */
  async getAllItems(): Promise<DemoEntity[]> {
    const list: DemoEntity[] = this.orm.query(DemoEntity).find();
    // 以更新时间/创建时间倒序排列,便于展示最新数据
    return list.sort((left: DemoEntity, right: DemoEntity) => {
      const leftTime: number = new Date(left.updatedAt ?? left.createdAt ?? "").getTime() || 0;
      const rightTime: number = new Date(right.updatedAt ?? right.createdAt ?? "").getTime() || 0;
      return rightTime - leftTime;
    });
  }

  /**
   * 根据主键查询单条记录
   * @param {number} id - 记录主键
   * @returns {Promise<DemoEntity | undefined>} 匹配到的 Demo 或 undefined
   */
  async getItemById(id: number): Promise<DemoEntity | undefined> {
    const result: DemoEntity[] = this.orm.query(DemoEntity).where("id", id).find();
    return result[0];
  }
}