// File: backend/src/modules/ai/entities/ai-audit-log.entity.ts
// Change Log
// - 2026-05-14: เพิ่ม ADR-023 feedback fields โดยคง legacy audit fields ไว้ช่วงเปลี่ยนผ่าน.
// - 2026-05-30: เพิ่ม modelType, vramUsageMB, cacheHit สำหรับ Typhoon OCR integration (T008, ADR-032).
// - 2026-06-11: เปลี่ยน Record<string, any> เป็น Record<string, unknown> เพื่อแก้ปัญหา ESLint
// Entity สำหรับตาราง ai_audit_logs — บันทึก AI Interaction และ feedback ตาม ADR-023

import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  Index,
} from 'typeorm';
import { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';

// สถานะการประมวลผลของ AI
export enum AiAuditStatus {
  SUCCESS = 'SUCCESS', // ประมวลผลสำเร็จ
  FAILED = 'FAILED', // ประมวลผลล้มเหลว
  TIMEOUT = 'TIMEOUT', // หมดเวลา
}

@Entity('ai_audit_logs')
export class AiAuditLog extends UuidBaseEntity {
  @PrimaryGeneratedColumn()
  id!: number;

  // UUID ของ MigrationLog ที่เกี่ยวข้อง (ใช้ UUID string ไม่ใช่ INT FK)
  @Index('idx_ai_audit_document')
  @Column({ name: 'document_public_id', type: 'uuid', nullable: true })
  documentPublicId?: string;

  // ชื่อ AI Model ที่ใช้ประมวลผล เช่น 'gemma4', 'paddleocr'
  @Index('idx_ai_audit_model')
  @Column({ name: 'ai_model', type: 'varchar', length: 50 })
  aiModel!: string;

  // ชื่อ Local Model ตาม ADR-023 development feedback log
  @Index('idx_ai_audit_model_name')
  @Column({ name: 'model_name', type: 'varchar', length: 100, nullable: true })
  modelName?: string;

  // ประเภท OCR/LLM model ที่ใช้ เช่น fast-path, np-dms-ocr, np-dms-ai (ADR-032)
  @Index('idx_ai_audit_model_type')
  @Column({ name: 'model_type', type: 'varchar', length: 50, nullable: true })
  modelType?: string;

  // VRAM ที่ใช้จริง (MB) ณ เวลาประมวลผล (ADR-032)
  @Column({ name: 'vram_usage_mb', type: 'int', nullable: true })
  vramUsageMb?: number;

  // ระบุว่าผลลัพธ์มาจาก Redis cache (true) หรือ OCR จริง (false) (ADR-032)
  @Column({ name: 'cache_hit', type: 'tinyint', width: 1, default: 0 })
  cacheHit!: boolean;

  // JSON ที่ AI แนะนำก่อนมนุษย์ตรวจสอบ
  @Column({ name: 'ai_suggestion_json', type: 'json', nullable: true })
  aiSuggestionJson?: Record<string, unknown>;

  // JSON ที่มนุษย์ยืนยันหรือแก้ไขจริง
  @Column({ name: 'human_override_json', type: 'json', nullable: true })
  humanOverrideJson?: Record<string, unknown>;

  // User ID ภายในของผู้ยืนยันผล AI
  @Index('idx_ai_audit_confirmed_by')
  @Column({ name: 'confirmed_by_user_id', type: 'int', nullable: true })
  confirmedByUserId?: number;

  // เวลาประมวลผลเป็น milliseconds
  @Column({ name: 'processing_time_ms', type: 'int', nullable: true })
  processingTimeMs?: number;

  // คะแนนความมั่นใจของ AI (0.00-1.00)
  @Column({
    name: 'confidence_score',
    type: 'decimal',
    precision: 3,
    scale: 2,
    nullable: true,
  })
  confidenceScore?: number;

  // SHA-256 hash ของ Input เพื่อ Audit Trail (ADR-018)
  @Column({ name: 'input_hash', type: 'varchar', length: 64, nullable: true })
  inputHash?: string;

  // SHA-256 hash ของ Output เพื่อ Audit Trail (ADR-018)
  @Column({ name: 'output_hash', type: 'varchar', length: 64, nullable: true })
  outputHash?: string;

  // สถานะการประมวลผล
  @Index('idx_ai_audit_status')
  @Column({
    type: 'enum',
    enum: AiAuditStatus,
  })
  status!: AiAuditStatus;

  // ข้อความ Error (ถ้ามี)
  @Column({ name: 'error_message', type: 'text', nullable: true })
  errorMessage?: string;

  @Column({
    name: 'effective_profile',
    type: 'varchar',
    length: 50,
    nullable: true,
  })
  effectiveProfile?: string;

  @Column({
    name: 'canonical_model',
    type: 'varchar',
    length: 50,
    nullable: true,
  })
  canonicalModel?: string;

  @Column({ name: 'snapshot_params_json', type: 'json', nullable: true })
  snapshotParamsJson?: Record<string, unknown>;

  @CreateDateColumn({ name: 'created_at' })
  createdAt!: Date;
}
