/**
 * PosicionGps Entity
 * ERP Transportistas
 *
 * Represents GPS positions (time-series data).
 * Adapted from erp-mecanicas-diesel MMD-014 GPS Integration
 * Module: MAI-006 Tracking
 */

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

@Entity({ name: 'posiciones_gps', schema: 'tracking' })
@Index('idx_posiciones_gps_tenant', ['tenantId'])
@Index('idx_posiciones_gps_dispositivo', ['dispositivoId'])
@Index('idx_posiciones_gps_unidad', ['unidadId'])
@Index('idx_posiciones_gps_tiempo', ['tiempoDispositivo'])
export class PosicionGps {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

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

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

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

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

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

  // Movement
  @Column({ type: 'decimal', precision: 6, scale: 2, nullable: true })
  velocidad?: number; // km/h

  @Column({ type: 'decimal', precision: 5, scale: 2, nullable: true })
  rumbo?: number; // degrees (0 = north)

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

  @Column({ type: 'decimal', precision: 4, scale: 2, nullable: true })
  hdop?: number; // Horizontal Dilution of Precision

  // Additional attributes from device
  @Column({ type: 'jsonb', default: {} })
  atributos: Record<string, any>;
  // Can contain: ignition, fuel, odometer, engineHours, batteryLevel, etc.

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

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

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

  // Validation
  @Column({ name: 'es_valido', type: 'boolean', default: true })
  esValido: boolean;

  @CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
  createdAt: Date;

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