/**
 * ReglaDespacho Entity
 * ERP Transportistas
 *
 * Rules for automatic assignment suggestions.
 * Module: MAI-005 Despacho
 * Adapted from: erp-mecanicas-diesel MMD-011 DispatchRule
 */

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

/**
 * Base dispatch conditions
 */
export interface CondicionesDespacho {
  // Skills and certifications
  requiereCertificaciones?: string[];
  nivelMinimoCertificacion?: 'basico' | 'intermedio' | 'avanzado' | 'experto' | 'federal';

  // Capacity
  capacidadMinimaUnidad?: 'light' | 'medium' | 'heavy';

  // Distance
  distanciaMaximaKm?: number;

  // Zones
  codigosZona?: string[];
  excluirGuardia?: boolean;
}

/**
 * Transport-specific dispatch conditions
 */
export interface CondicionesDespachoTransporte extends CondicionesDespacho {
  // Weight capacities
  pesoMinimoKg?: number;
  pesoMaximoKg?: number;

  // Temperature control
  requiereRefrigeracion?: boolean;
  temperaturaMin?: number;
  temperaturaMax?: number;

  // Licenses and permits
  requiereLicenciaFederal?: boolean;
  requiereCertificadoMP?: boolean; // Materiales peligrosos

  // Availability (HOS - Hours of Service)
  horasDisponiblesMinimas?: number;

  // Zone restrictions
  zonasPermitidas?: string[];
  zonasRestringidas?: string[];

  // Trip types
  tiposViaje?: ('LOCAL' | 'FORANEO' | 'INTERNACIONAL')[];
}

@Entity({ name: 'reglas_despacho', schema: 'despacho' })
@Index('idx_reglas_despacho_tenant', ['tenantId'])
@Index('idx_reglas_despacho_prioridad', ['tenantId', 'prioridad'])
export class ReglaDespacho {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  @Column({ type: 'varchar', length: 100 })
  nombre: string;

  @Column({ type: 'text', nullable: true })
  descripcion?: string;

  @Column({ type: 'integer', default: 0 })
  prioridad: number;

  // Applicability (transport-specific)
  @Column({ name: 'tipo_viaje', type: 'varchar', length: 50, nullable: true })
  tipoViaje?: string;

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

  // Conditions (supports both base and transport-specific)
  @Column({ type: 'jsonb', default: {} })
  condiciones: CondicionesDespachoTransporte;

  // Action
  @Column({ name: 'auto_asignar', type: 'boolean', default: false })
  autoAsignar: boolean;

  @Column({ name: 'peso_asignacion', type: 'integer', default: 100 })
  pesoAsignacion: number;

  @Column({ type: 'boolean', default: true })
  activo: boolean;

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

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

  @Column({ name: 'created_by', type: 'uuid', nullable: true })
  createdBy?: string;
}
