/**
 * EventoGeocerca Entity
 * ERP Transportistas
 *
 * Represents geofence entry/exit events.
 * Adapted from erp-mecanicas-diesel MMD-014 GPS Integration
 * Module: MAI-006 Tracking
 */

import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  ManyToOne,
  JoinColumn,
  Index,
} from 'typeorm';
import { DispositivoGps } from './dispositivo-gps.entity';
import { PosicionGps } from './posicion-gps.entity';

export enum TipoEventoGeocerca {
  ENTRADA = 'entrada',
  SALIDA = 'salida',
  PERMANENCIA = 'permanencia',
}

@Entity({ name: 'eventos_geocerca', schema: 'tracking' })
@Index('idx_eventos_geocerca_tenant', ['tenantId'])
@Index('idx_eventos_geocerca_geocerca', ['geocercaId'])
@Index('idx_eventos_geocerca_dispositivo', ['dispositivoId'])
@Index('idx_eventos_geocerca_unidad', ['unidadId'])
@Index('idx_eventos_geocerca_tiempo', ['tiempoEvento'])
export class EventoGeocerca {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  @Column({ name: 'geocerca_id', type: 'uuid' })
  geocercaId: string;

  @Column({ name: 'dispositivo_id', type: 'uuid' })
  dispositivoId: string;

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

  // Event type
  @Column({
    name: 'tipo_evento',
    type: 'varchar',
    length: 15,
  })
  tipoEvento: TipoEventoGeocerca;

  // Position that triggered the event
  @Column({ name: 'posicion_id', type: 'uuid', nullable: true })
  posicionId?: string;

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

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

  // Timestamps
  @Column({ name: 'tiempo_evento', type: 'timestamptz' })
  tiempoEvento: Date;

  @Column({ name: 'procesado_at', type: 'timestamptz', default: () => 'NOW()' })
  procesadoAt: Date;

  // Link to operations (viaje instead of incident)
  @Column({ name: 'viaje_id', type: 'uuid', nullable: true })
  viajeId?: string; // FK to transport.viajes if applicable

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

  // Relations
  @ManyToOne(() => DispositivoGps, dispositivo => dispositivo.eventosGeocerca)
  @JoinColumn({ name: 'dispositivo_id' })
  dispositivo: DispositivoGps;

  @ManyToOne(() => PosicionGps)
  @JoinColumn({ name: 'posicion_id' })
  posicion?: PosicionGps;
}
