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

/**
 * Tipo de Evento de Tracking
 */
export enum TipoEventoTracking {
  POSICION = 'POSICION',
  SALIDA = 'SALIDA',
  ARRIBO_ORIGEN = 'ARRIBO_ORIGEN',
  INICIO_CARGA = 'INICIO_CARGA',
  FIN_CARGA = 'FIN_CARGA',
  ARRIBO_DESTINO = 'ARRIBO_DESTINO',
  INICIO_DESCARGA = 'INICIO_DESCARGA',
  FIN_DESCARGA = 'FIN_DESCARGA',
  ENTREGA_POD = 'ENTREGA_POD',
  DESVIO = 'DESVIO',
  PARADA = 'PARADA',
  INCIDENTE = 'INCIDENTE',
  GPS_POSICION = 'GPS_POSICION',
  GEOCERCA_ENTRADA = 'GEOCERCA_ENTRADA',
  GEOCERCA_SALIDA = 'GEOCERCA_SALIDA',
}

/**
 * Fuente del Evento
 */
export enum FuenteEvento {
  GPS = 'GPS',
  APP_OPERADOR = 'APP_OPERADOR',
  SISTEMA = 'SISTEMA',
  MANUAL = 'MANUAL',
  GEOCERCA = 'GEOCERCA',
}

@Entity({ schema: 'tracking', name: 'eventos' })
@Index('idx_evento_viaje', ['viajeId'])
@Index('idx_evento_tipo', ['tenantId', 'tipoEvento'])
@Index('idx_evento_fecha', ['timestampEvento'])
export class EventoTracking {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

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

  // Unidad
  @Column({ name: 'unidad_id', type: 'uuid', nullable: true })
  unidadId: string;

  // Operador
  @Column({ name: 'operador_id', type: 'uuid', nullable: true })
  operadorId: string;

  // Tipo y fuente
  @Column({ name: 'tipo_evento', type: 'enum', enum: TipoEventoTracking })
  tipoEvento: TipoEventoTracking;

  @Column({ type: 'enum', enum: FuenteEvento })
  fuente: FuenteEvento;

  // Ubicación
  @Column({ type: 'decimal', precision: 10, scale: 7, nullable: true })
  latitud: number;

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

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

  // Timestamp
  @Column({ name: 'timestamp', type: 'timestamptz' })
  timestamp: Date;

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

  @CreateDateColumn({ name: 'timestamp_registro', type: 'timestamptz' })
  timestampRegistro: Date;

  // Datos GPS adicionales
  @Column({ type: 'decimal', precision: 6, scale: 2, nullable: true })
  velocidad: number;

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

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

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

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

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

  @Column({ name: 'motor_encendido', type: 'boolean', nullable: true })
  motorEncendido: boolean;

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

  @Column({ name: 'datos_adicionales', type: 'jsonb', nullable: true })
  datosAdicionales: Record<string, any>;

  // Datos específicos del evento
  @Column({ type: 'jsonb', nullable: true })
  datos: Record<string, any>;

  // Parada asociada (si aplica)
  @Column({ name: 'parada_id', type: 'uuid', nullable: true })
  paradaId: string;

  // Usuario/Operador que generó
  @Column({ name: 'generado_por_id', type: 'uuid', nullable: true })
  generadoPorId: string;

  @Column({ name: 'generado_por_tipo', type: 'varchar', length: 20, nullable: true })
  generadoPorTipo: string;

  // Evidencias
  @Column({ type: 'jsonb', nullable: true })
  evidencias: Record<string, any>;

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