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

/**
 * Tipo de Unidad
 */
export enum TipoUnidad {
  TRACTORA = 'TRACTORA',
  REMOLQUE = 'REMOLQUE',
  CAJA_SECA = 'CAJA_SECA',
  CAJA_REFRIGERADA = 'CAJA_REFRIGERADA',
  PLATAFORMA = 'PLATAFORMA',
  TANQUE = 'TANQUE',
  PORTACONTENEDOR = 'PORTACONTENEDOR',
  TORTON = 'TORTON',
  RABON = 'RABON',
  CAMIONETA = 'CAMIONETA',
}

/**
 * Estado de Unidad
 */
export enum EstadoUnidad {
  DISPONIBLE = 'DISPONIBLE',
  EN_VIAJE = 'EN_VIAJE',
  EN_RUTA = 'EN_RUTA',
  EN_TALLER = 'EN_TALLER',
  BLOQUEADA = 'BLOQUEADA',
  BAJA = 'BAJA',
}

@Entity({ schema: 'fleet', name: 'unidades' })
@Index('idx_unidad_tenant', ['tenantId'])
@Index('idx_unidad_tipo', ['tenantId', 'tipo'])
@Index('idx_unidad_estado', ['tenantId', 'estado'])
export class Unidad {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  // Identificación
  @Column({ name: 'numero_economico', type: 'varchar', length: 20 })
  numeroEconomico: string;

  @Column({ type: 'enum', enum: TipoUnidad })
  tipo: TipoUnidad;

  // Vehículo
  @Column({ type: 'varchar', length: 50, nullable: true })
  marca: string;

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

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

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

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

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

  // Sucursal
  @Column({ name: 'sucursal_id', type: 'uuid', nullable: true })
  sucursalId: string;

  // Placas
  @Column({ type: 'varchar', length: 15, nullable: true })
  placa: string;

  @Column({ type: 'varchar', length: 15, nullable: true })
  placas: string;

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

  // SCT
  @Column({ name: 'permiso_sct', type: 'varchar', length: 50, nullable: true })
  permisoSct: string;

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

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

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

  @Column({ name: 'capacidad_volumen_m3', type: 'decimal', precision: 10, scale: 4, nullable: true })
  capacidadVolumenM3: number;

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

  // Combustible
  @Column({ name: 'tipo_combustible', type: 'varchar', length: 20, nullable: true })
  tipoCombustible: string;

  @Column({ name: 'rendimiento_km_litro', type: 'decimal', precision: 6, scale: 2, nullable: true })
  rendimientoKmLitro: number;

  @Column({ name: 'capacidad_tanque_litros', type: 'decimal', precision: 8, scale: 2, nullable: true })
  capacidadTanqueLitros: number;

  // Odómetro
  @Column({ name: 'odometro_actual', type: 'int', default: 0 })
  odometroActual: number;

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

  // GPS
  @Column({ name: 'tiene_gps', type: 'boolean', default: false })
  tieneGps: boolean;

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

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

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

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

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

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

  // Propiedad
  @Column({ name: 'es_propia', type: 'boolean', default: true })
  esPropia: boolean;

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

  // Costos
  @Column({ name: 'costo_adquisicion', type: 'decimal', precision: 15, scale: 2, nullable: true })
  costoAdquisicion: number;

  @Column({ name: 'fecha_adquisicion', type: 'date', nullable: true })
  fechaAdquisicion: Date;

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

  // Fechas importantes
  @Column({ name: 'fecha_verificacion_proxima', type: 'date', nullable: true })
  fechaVerificacionProxima: Date;

  @Column({ name: 'fecha_poliza_vencimiento', type: 'date', nullable: true })
  fechaPolizaVencimiento: Date;

  @Column({ name: 'fecha_permiso_vencimiento', type: 'date', nullable: true })
  fechaPermisoVencimiento: Date;

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

  @Column({ name: 'fecha_baja', type: 'date', nullable: true })
  fechaBaja: Date;

  @Column({ name: 'motivo_baja', type: 'text', nullable: true })
  motivoBaja: 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;
}
