/**
 * EstadoUnidad Entity
 * ERP Transportistas
 *
 * Real-time status of fleet units for dispatch.
 * Module: MAI-005 Despacho
 * Adapted from: erp-mecanicas-diesel MMD-011 Dispatch Center
 */

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

export enum EstadoUnidadEnum {
  AVAILABLE = 'available',
  ASSIGNED = 'assigned',
  EN_ROUTE = 'en_route',
  ON_SITE = 'on_site',
  RETURNING = 'returning',
  OFFLINE = 'offline',
  MAINTENANCE = 'maintenance',
}

export enum CapacidadUnidad {
  LIGHT = 'light',
  MEDIUM = 'medium',
  HEAVY = 'heavy',
}

@Entity({ name: 'estado_unidades', schema: 'despacho' })
@Index('idx_estado_unidades_tenant_unit', ['tenantId', 'unidadId'], { unique: true })
@Index('idx_estado_unidades_status', ['tenantId', 'estado'])
export class EstadoUnidad {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  // Unit reference (FK a fleet.unidades)
  @Column({ name: 'unidad_id', type: 'uuid' })
  unidadId: string;

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

  @Column({ name: 'nombre_unidad', type: 'varchar', length: 100, nullable: true })
  nombreUnidad?: string;

  // Status
  @Column({
    type: 'varchar',
    length: 20,
    default: EstadoUnidadEnum.OFFLINE,
  })
  estado: EstadoUnidadEnum;

  // Current assignment - viaje instead of incident
  @Column({ name: 'viaje_actual_id', type: 'uuid', nullable: true })
  viajeActualId?: string;

  // Operadores instead of technicians
  @Column({ name: 'operador_ids', type: 'uuid', array: true, default: [] })
  operadorIds: string[];

  // Location (cached from GPS)
  @Column({ name: 'ultima_posicion_id', type: 'uuid', nullable: true })
  ultimaPosicionId?: string;

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

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

  @Column({ name: 'ultima_actualizacion_ubicacion', type: 'timestamptz', nullable: true })
  ultimaActualizacionUbicacion?: Date;

  // Timing
  @Column({ name: 'ultimo_cambio_estado', type: 'timestamptz', default: () => 'NOW()' })
  ultimoCambioEstado: Date;

  @Column({ name: 'disponible_estimado_en', type: 'timestamptz', nullable: true })
  disponibleEstimadoEn?: Date;

  // Capacity and capabilities
  @Column({
    name: 'capacidad_unidad',
    type: 'varchar',
    length: 20,
    default: CapacidadUnidad.LIGHT,
  })
  capacidadUnidad: CapacidadUnidad;

  @Column({ name: 'puede_remolcar', type: 'boolean', default: false })
  puedeRemolcar: boolean;

  @Column({ name: 'peso_max_remolque_kg', type: 'integer', nullable: true })
  pesoMaxRemolqueKg?: number;

  // Transport-specific fields
  @Column({ name: 'es_refrigerada', type: 'boolean', default: false })
  esRefrigerada: boolean;

  @Column({ name: 'capacidad_peso_kg', type: 'decimal', precision: 10, scale: 2, nullable: true })
  capacidadPesoKg?: number;

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

  @Column({ type: 'jsonb', default: {} })
  metadata: Record<string, any>;

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