/**
 * DispositivoGps Entity
 * ERP Transportistas
 *
 * Represents GPS tracking devices linked to fleet units.
 * Adapted from erp-mecanicas-diesel MMD-014 GPS Integration
 * Module: MAI-006 Tracking
 */

import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  OneToMany,
  Index,
} from 'typeorm';
import { PosicionGps } from './posicion-gps.entity';
import { EventoGeocerca } from './evento-geocerca.entity';
import { SegmentoRuta } from './segmento-ruta.entity';

export enum PlataformaGps {
  TRACCAR = 'traccar',
  WIALON = 'wialon',
  SAMSARA = 'samsara',
  GEOTAB = 'geotab',
  MANUAL = 'manual',
}

export enum TipoUnidadGps {
  TRACTORA = 'tractora',
  REMOLQUE = 'remolque',
  CAJA = 'caja',
  EQUIPO = 'equipo',
  OPERADOR = 'operador',
}

@Entity({ name: 'dispositivos_gps', schema: 'tracking' })
@Index('idx_dispositivos_gps_tenant', ['tenantId'])
@Index('idx_dispositivos_gps_unidad', ['unidadId'])
@Index('idx_dispositivos_gps_external', ['externalDeviceId'])
@Index('idx_dispositivos_gps_plataforma', ['plataforma'])
export class DispositivoGps {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  // Link to fleet unit (fleet.unidades)
  @Column({ name: 'unidad_id', type: 'uuid' })
  unidadId: string;

  @Column({
    name: 'tipo_unidad',
    type: 'varchar',
    length: 20,
    default: TipoUnidadGps.TRACTORA,
  })
  tipoUnidad: TipoUnidadGps;

  // External platform identification
  @Column({ name: 'external_device_id', type: 'varchar', length: 100 })
  externalDeviceId: string;

  @Column({
    type: 'varchar',
    length: 30,
    default: PlataformaGps.TRACCAR,
  })
  plataforma: PlataformaGps;

  // Device identifiers
  @Column({ type: 'varchar', length: 20, nullable: true })
  imei?: string;

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

  @Column({ type: 'varchar', length: 20, nullable: true })
  telefono?: string;

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

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

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

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

  @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;

  // Configuration
  @Column({ name: 'intervalo_posicion_segundos', type: 'integer', default: 30 })
  intervaloPosicionSegundos: number;

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

  // Audit
  @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;

  // Relations
  @OneToMany(() => PosicionGps, position => position.dispositivo)
  posiciones: PosicionGps[];

  @OneToMany(() => EventoGeocerca, event => event.dispositivo)
  eventosGeocerca: EventoGeocerca[];

  @OneToMany(() => SegmentoRuta, segment => segment.dispositivo)
  segmentosRuta: SegmentoRuta[];
}
