// src/models/BaseModel.ts
import {
  Model,
  QueryBuilder as ObjectionQueryBuilder,
  QueryBuilderType,
} from "objection";

// Custom QueryBuilder with whereNotDeleted
export class CustomQueryBuilder<
  M extends Model,
  R = M[]
> extends ObjectionQueryBuilder<M, R> {
  whereNotDeleted(): this {
    return this.whereNull(`${this.modelClass().tableName}.deleted_at`);
  }
}

// BaseModel with typed QueryBuilder and lifecycle hooks
export class BaseModel extends Model {
  deleted_at?: string | null;
  created_at?: string;
  updated_at?: string;

  static QueryBuilder = CustomQueryBuilder;
  static useLimitInFirst = true;

  static override query(trxOrKnex?: any): QueryBuilderType<any> {
    return super.query(trxOrKnex) as CustomQueryBuilder<any>;
  }

  $beforeInsert() {
    this.created_at = new Date().toISOString();
    this.updated_at = new Date().toISOString();
  }

  $beforeUpdate() {
    this.updated_at = new Date().toISOString();
  }
}
