import { Entity, Column, ManyToOne, JoinColumn, Index } from 'typeorm';
import { BaseEntity } from '../database/base.entity';
import { ActivityTicketBatchEntity } from './activity-ticket-batch.entity';
import { BookingActivityItemEntity } from './booking-activity-item.entity';

export enum TicketItemStatus {
  AVAILABLE = 'AVAILABLE',
  ASSIGNED = 'ASSIGNED',
  CANCELLED = 'CANCELLED',
  EXPIRED = 'EXPIRED',
  WASTED = 'WASTED',
}

export enum TicketDispatchVia {
  WHATSAPP = 'WHATSAPP',
  EMAIL = 'EMAIL',
  PHYSICAL = 'PHYSICAL',
}

@Entity('activity_ticket_items')
@Index(['tenant_id', 'batch_id', 'ticket_ref_no'], { unique: true, where: '"is_deleted" = false' })
export class ActivityTicketItemEntity extends BaseEntity {
  @ManyToOne(() => ActivityTicketBatchEntity, (batch) => batch.items, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'batch_id' })
  batch: ActivityTicketBatchEntity;

  @Column({ type: 'uuid' })
  batch_id: string;

  @Column({ type: 'varchar', length: 255 })
  ticket_ref_no: string;

  @Column({ type: 'varchar', length: 500, nullable: true })
  document_url: string | null;

  @Column({ type: 'enum', enum: TicketItemStatus, default: TicketItemStatus.AVAILABLE })
  status: TicketItemStatus;

  // Set when assigned from Movement Dashboard → By Activity
  @ManyToOne(() => BookingActivityItemEntity, { nullable: true, onDelete: 'SET NULL' })
  @JoinColumn({ name: 'booking_activity_item_id' })
  booking_activity_item: BookingActivityItemEntity | null;

  @Column({ type: 'uuid', nullable: true })
  booking_activity_item_id: string | null;

  @Column({ type: 'uuid', nullable: true })
  assigned_by: string | null;

  @Column({ type: 'timestamptz', nullable: true })
  assigned_at: Date | null;

  @Column({ type: 'enum', enum: TicketDispatchVia, nullable: true })
  dispatched_via: TicketDispatchVia | null;

  @Column({ type: 'timestamptz', nullable: true })
  dispatched_at: Date | null;

  @Column({ type: 'text', nullable: true })
  notes: string | null;
}
