// File: src/modules/workflow-engine/entities/workflow-instance.entity.ts

import {
  Column,
  CreateDateColumn,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from 'typeorm';
import { WorkflowDefinition } from './workflow-definition.entity';

export enum WorkflowStatus {
  ACTIVE = 'ACTIVE', // กำลังดำเนินการ
  COMPLETED = 'COMPLETED', // จบกระบวนการ (ถึง Terminal State)
  CANCELLED = 'CANCELLED', // ถูกยกเลิกกลางคัน
  TERMINATED = 'TERMINATED', // ถูกบังคับจบโดยระบบ หรือ Error
}

/**
 * เก็บสถานะการเดินเรื่องของเอกสารแต่ละใบ (Runtime State)
 */
@Entity('workflow_instances')
@Index(['entityType', 'entityId']) // เพื่อค้นหาว่าเอกสารนี้ (เช่น RFA-001) อยู่ขั้นตอนไหน
@Index(['currentState']) // เพื่อ Dashboard: "มีงานค้างที่ขั้นตอนไหนบ้าง"
export class WorkflowInstance {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  // ผูกกับ Definition เพื่อรู้ว่าใช้กฎชุดไหน (Version ไหน)
  @ManyToOne(() => WorkflowDefinition)
  @JoinColumn({ name: 'definition_id' })
  definition!: WorkflowDefinition;

  @Column({ name: 'definition_id' })
  definitionId!: string;

  @Column({
    name: 'contract_id',
    type: 'int',
    nullable: true,
    comment: 'Contract ที่ Workflow นี้เป็นส่วนหนึ่ง (NULL = global/legacy)',
  })
  contractId?: number | null;

  // Polymorphic Relation: เชื่อมกับเอกสารได้หลายประเภท (RFA, CORR, etc.) โดยไม่ต้อง Foreign Key จริง
  @Column({
    name: 'entity_type',
    length: 50,
    comment: 'ประเภทเอกสาร เช่น rfa, correspondence',
  })
  entityType!: string;

  @Column({
    name: 'entity_id',
    length: 50,
    comment: 'ID ของเอกสาร (String/UUID)',
  })
  entityId!: string;

  @Column({
    name: 'current_state',
    length: 50,
    comment: 'ชื่อ State ปัจจุบัน เช่น DRAFT, IN_REVIEW',
  })
  currentState!: string;

  @Column({
    type: 'enum',
    enum: WorkflowStatus,
    default: WorkflowStatus.ACTIVE,
    comment: 'สถานะภาพรวมของ Instance',
  })
  status!: WorkflowStatus;

  // Context: เก็บตัวแปรที่จำเป็นสำหรับการตัดสินใจใน Workflow
  // เช่น { "amount": 500000, "requester_role": "ENGINEER", "approver_ids": [1, 2] }
  @Column({ type: 'json', nullable: true, comment: 'Runtime Context Data' })
  context?: Record<string, unknown>;

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

  @UpdateDateColumn({ name: 'updated_at' })
  updatedAt!: Date;

  // ADR-001 v1.1 FR-002: Optimistic lock — incremented on every successful transition
  // Client ส่งค่านี้มาด้วยทุกครั้งที่ transition; Server reject HTTP 409 ถ้าไม่ตรง
  @Column({
    name: 'version_no',
    type: 'int',
    default: 1,
    comment:
      'Optimistic lock counter — incremented on each successful transition (ADR-001 v1.1 FR-002)',
  })
  versionNo!: number;
}
