import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  Index,
  ManyToOne,
  JoinColumn,
} from 'typeorm';

/**
 * Estado de la Orden de Transporte
 */
export enum EstadoOrdenTransporte {
  BORRADOR = 'BORRADOR',
  PENDIENTE = 'PENDIENTE',
  SOLICITADA = 'SOLICITADA',
  CONFIRMADA = 'CONFIRMADA',
  ASIGNADA = 'ASIGNADA',
  EN_PROCESO = 'EN_PROCESO',
  EN_TRANSITO = 'EN_TRANSITO',
  COMPLETADA = 'COMPLETADA',
  ENTREGADA = 'ENTREGADA',
  FACTURADA = 'FACTURADA',
  CANCELADA = 'CANCELADA',
}

/**
 * Tipo de Equipo Requerido
 */
export enum TipoEquipo {
  CAJA_SECA = 'CAJA_SECA',
  CAJA_REFRIGERADA = 'CAJA_REFRIGERADA',
  PLATAFORMA = 'PLATAFORMA',
  TANQUE = 'TANQUE',
  PORTACONTENEDOR = 'PORTACONTENEDOR',
  TORTON = 'TORTON',
  RABON = 'RABON',
  CAMIONETA = 'CAMIONETA',
}

/**
 * Tipo de Carga
 */
export enum TipoCarga {
  GENERAL = 'GENERAL',
  PELIGROSA = 'PELIGROSA',
  REFRIGERADA = 'REFRIGERADA',
  SOBREDIMENSIONADA = 'SOBREDIMENSIONADA',
  GRANEL = 'GRANEL',
  LIQUIDOS = 'LIQUIDOS',
  CONTENEDOR = 'CONTENEDOR',
  AUTOMOVILES = 'AUTOMOVILES',
}

/**
 * Modalidad de Servicio
 */
export enum ModalidadServicio {
  FTL = 'FTL',         // Full Truck Load
  LTL = 'LTL',         // Less Than Truck Load
  DEDICADO = 'DEDICADO',
  EXPRESS = 'EXPRESS',
  CONSOLIDADO = 'CONSOLIDADO',
}

@Entity({ schema: 'transport', name: 'ordenes_transporte' })
@Index('idx_ot_tenant', ['tenantId'])
@Index('idx_ot_estado', ['tenantId', 'estado'])
@Index('idx_ot_shipper', ['tenantId', 'shipperId'])
export class OrdenTransporte {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  // Identificación
  @Column({ type: 'varchar', length: 50 })
  codigo: string;

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

  @Column({ name: 'referencia_cliente', type: 'varchar', length: 100, nullable: true })
  referenciaCliente: string;

  // Cliente (Shipper/clienteId)
  @Column({ name: 'cliente_id', type: 'uuid' })
  clienteId: string;

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

  @Column({ name: 'shipper_nombre', type: 'varchar', length: 200 })
  shipperNombre: string;

  // Destinatario (Consignee)
  @Column({ name: 'consignee_id', type: 'uuid' })
  consigneeId: string;

  @Column({ name: 'consignee_nombre', type: 'varchar', length: 200 })
  consigneeNombre: string;

  // Origen
  @Column({ name: 'origen_direccion', type: 'text' })
  origenDireccion: string;

  @Column({ name: 'origen_codigo_postal', type: 'varchar', length: 10, nullable: true })
  origenCodigoPostal: string;

  @Column({ name: 'origen_ciudad', type: 'varchar', length: 100, nullable: true })
  origenCiudad: string;

  @Column({ name: 'origen_estado', type: 'varchar', length: 100, nullable: true })
  origenEstado: string;

  @Column({ name: 'origen_latitud', type: 'decimal', precision: 10, scale: 7, nullable: true })
  origenLatitud: number;

  @Column({ name: 'origen_longitud', type: 'decimal', precision: 10, scale: 7, nullable: true })
  origenLongitud: number;

  @Column({ name: 'origen_contacto', type: 'varchar', length: 200, nullable: true })
  origenContacto: string;

  @Column({ name: 'origen_telefono', type: 'varchar', length: 30, nullable: true })
  origenTelefono: string;

  // Destino
  @Column({ name: 'destino_direccion', type: 'text' })
  destinoDireccion: string;

  @Column({ name: 'destino_codigo_postal', type: 'varchar', length: 10, nullable: true })
  destinoCodigoPostal: string;

  @Column({ name: 'destino_ciudad', type: 'varchar', length: 100, nullable: true })
  destinoCiudad: string;

  @Column({ name: 'destino_estado', type: 'varchar', length: 100, nullable: true })
  destinoEstado: string;

  @Column({ name: 'destino_latitud', type: 'decimal', precision: 10, scale: 7, nullable: true })
  destinoLatitud: number;

  @Column({ name: 'destino_longitud', type: 'decimal', precision: 10, scale: 7, nullable: true })
  destinoLongitud: number;

  @Column({ name: 'destino_contacto', type: 'varchar', length: 200, nullable: true })
  destinoContacto: string;

  @Column({ name: 'destino_telefono', type: 'varchar', length: 30, nullable: true })
  destinoTelefono: string;

  // Fechas programadas
  @Column({ name: 'fecha_recoleccion', type: 'timestamptz', nullable: true })
  fechaRecoleccion: Date;

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

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

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

  // Carga
  @Column({ name: 'tipo_carga', type: 'enum', enum: TipoCarga, default: TipoCarga.GENERAL })
  tipoCarga: TipoCarga;

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

  @Column({ name: 'peso_kg', type: 'decimal', precision: 12, scale: 2, nullable: true })
  pesoKg: number;

  @Column({ name: 'volumen_m3', type: 'decimal', precision: 12, scale: 4, nullable: true })
  volumenM3: number;

  @Column({ type: 'int', nullable: true })
  piezas: number;

  @Column({ type: 'int', nullable: true })
  pallets: number;

  @Column({ name: 'valor_declarado', type: 'decimal', precision: 15, scale: 2, nullable: true })
  valorDeclarado: number;

  // Requisitos
  @Column({ name: 'requiere_temperatura', type: 'boolean', default: false })
  requiereTemperatura: boolean;

  @Column({ name: 'temperatura_min', type: 'decimal', precision: 5, scale: 2, nullable: true })
  temperaturaMin: number;

  @Column({ name: 'temperatura_max', type: 'decimal', precision: 5, scale: 2, nullable: true })
  temperaturaMax: number;

  @Column({ name: 'requiere_gps', type: 'boolean', default: false })
  requiereGps: boolean;

  @Column({ name: 'requiere_escolta', type: 'boolean', default: false })
  requiereEscolta: boolean;

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

  // Servicio y tarifa
  @Column({ name: 'modalidad_servicio', type: 'enum', enum: ModalidadServicio, default: ModalidadServicio.FTL })
  modalidadServicio: ModalidadServicio;

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

  @Column({ name: 'tarifa_base', type: 'decimal', precision: 15, scale: 2, nullable: true })
  tarifaBase: number;

  @Column({ type: 'decimal', precision: 15, scale: 2, default: 0 })
  recargos: number;

  @Column({ type: 'decimal', precision: 15, scale: 2, default: 0 })
  descuentos: number;

  @Column({ type: 'decimal', precision: 15, scale: 2, nullable: true })
  subtotal: number;

  @Column({ type: 'decimal', precision: 15, scale: 2, nullable: true })
  iva: number;

  @Column({ type: 'decimal', precision: 15, scale: 2, nullable: true })
  total: number;

  // Estado
  @Column({ type: 'enum', enum: EstadoOrdenTransporte, default: EstadoOrdenTransporte.BORRADOR })
  estado: EstadoOrdenTransporte;

  // Asignación
  @Column({ name: 'viaje_id', type: 'uuid', nullable: true })
  viajeId: string;

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

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

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

  @UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
  updatedAt: Date;

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

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