import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  Index,
  ManyToOne,
  JoinColumn,
} from 'typeorm';
import { Viaje } from './viaje.entity';
import { ParadaViaje } from './parada-viaje.entity';

/**
 * Estado del POD (Proof of Delivery)
 */
export enum EstadoPod {
  PENDIENTE = 'PENDIENTE',
  PARCIAL = 'PARCIAL',
  COMPLETO = 'COMPLETO',
  RECHAZADO = 'RECHAZADO',
}

/**
 * Foto de Evidencia
 */
export interface FotoEvidencia {
  url: string;
  descripcion?: string;
  tipo: 'MERCANCIA' | 'FIRMA' | 'DANIO' | 'SELLO' | 'DOCUMENTO' | 'OTRO';
  timestamp: Date;
}

@Entity({ schema: 'transport', name: 'pod' })
@Index('idx_pod_viaje', ['viajeId'])
@Index('idx_pod_estado', ['tenantId', 'estado'])
export class Pod {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ name: 'tenant_id', type: 'uuid' })
  tenantId: string;

  @Column({ name: 'viaje_id', type: 'uuid' })
  viajeId: string;

  @ManyToOne(() => Viaje)
  @JoinColumn({ name: 'viaje_id' })
  viaje: Viaje;

  @Column({ name: 'parada_id', type: 'uuid', nullable: true })
  paradaId: string;

  @ManyToOne(() => ParadaViaje)
  @JoinColumn({ name: 'parada_id' })
  parada: ParadaViaje;

  @Column({ name: 'ot_id', type: 'uuid', nullable: true })
  otId: string;

  // Estado POD
  @Column({ type: 'enum', enum: EstadoPod, default: EstadoPod.PENDIENTE })
  estado: EstadoPod;

  // Recepción
  @Column({ name: 'receptor_nombre', type: 'varchar', length: 200, nullable: true })
  receptorNombre: string;

  @Column({ name: 'receptor_identificacion', type: 'varchar', length: 50, nullable: true })
  receptorIdentificacion: string;

  @Column({ name: 'fecha_recepcion', type: 'timestamptz', nullable: true })
  fechaRecepcion: Date;

  // Firma digital (Base64 de la imagen de firma)
  @Column({ name: 'firma_digital', type: 'text', nullable: true })
  firmaDigital: string;

  // Evidencias (URLs o IDs de archivos)
  @Column({ name: 'fotos_entrega', type: 'jsonb', nullable: true })
  fotosEntrega: FotoEvidencia[];

  // Cantidades
  @Column({ name: 'piezas_entregadas', type: 'int', nullable: true })
  piezasEntregadas: number;

  @Column({ name: 'piezas_rechazadas', type: 'int', nullable: true })
  piezasRechazadas: number;

  @Column({ name: 'piezas_danadas', type: 'int', nullable: true })
  piezasDanadas: number;

  // Observaciones
  @Column({ type: 'text', nullable: true })
  observaciones: string;

  @Column({ name: 'motivo_rechazo', type: 'text', nullable: true })
  motivoRechazo: string;

  // Auditoría
  @CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
  createdAt: Date;

  @Column({ name: 'created_by_id', type: 'uuid', nullable: true })
  createdById: string;

  // Helpers
  get entregaCompleta(): boolean {
    return this.estado === EstadoPod.COMPLETO &&
           (this.piezasRechazadas || 0) === 0 &&
           (this.piezasDanadas || 0) === 0;
  }

  get tieneFirma(): boolean {
    return !!this.firmaDigital;
  }

  get tieneEvidenciasFotograficas(): boolean {
    return Array.isArray(this.fotosEntrega) && this.fotosEntrega.length > 0;
  }
}
