import db from '../config/database';
import { ServiceGuard } from '../core/guards/service.guard';

/**
 * 基础Repository类
 * 所有数据库操作必须通过Repository层
 */
export class BaseRepository {
  protected tableName: string;

  constructor(tableName: string) {
    this.tableName = tableName;
  }

  /**
   * 创建记录
   * @param data 数据对象
   * @returns 创建的记录
   */
  @ServiceGuard.NoDirectDatabaseAccess()
  async create(data: any) {
    return await db(this.tableName).insert(data).returning('*');
  }

  /**
   * 根据ID获取记录
   * @param id 记录ID
   * @returns 记录对象
   */
  @ServiceGuard.NoDirectDatabaseAccess()
  async findById(id: string) {
    return await db(this.tableName).where({ id }).first();
  }

  /**
   * 查询记录列表
   * @param conditions 查询条件
   * @param options 选项
   * @returns 记录列表
   */
  @ServiceGuard.NoDirectDatabaseAccess()
  async find(conditions: any = {}, options: any = {}) {
    let query = db(this.tableName).where(conditions);

    if (options.orderBy) {
      query = query.orderBy(options.orderBy);
    }

    if (options.limit) {
      query = query.limit(options.limit);
    }

    if (options.offset) {
      query = query.offset(options.offset);
    }

    return await query;
  }

  /**
   * 更新记录
   * @param id 记录ID
   * @param data 更新数据
   * @returns 更新结果
   */
  @ServiceGuard.NoDirectDatabaseAccess()
  async update(id: string, data: any) {
    return await db(this.tableName).where({ id }).update(data).returning('*');
  }

  /**
   * 删除记录
   * @param id 记录ID
   * @returns 删除结果
   */
  @ServiceGuard.NoDirectDatabaseAccess()
  async delete(id: string) {
    return await db(this.tableName).where({ id }).del();
  }

  /**
   * 计数
   * @param conditions 查询条件
   * @returns 记录数量
   */
  @ServiceGuard.NoDirectDatabaseAccess()
  async count(conditions: any = {}) {
    const result = await db(this.tableName).where(conditions).count('id as count').first();
    return Number(result?.count || 0);
  }
}
