/**
 * SegmentoRuta Entity
 * ERP Transportistas
 *
 * Represents route segments for distance calculation and billing.
 * 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';
import { PosicionGps } from './posicion-gps.entity';

export enum TipoSegmento {
  HACIA_DESTINO = 'hacia_destino',     // Trip to destination
  EN_DESTINO = 'en_destino',           // At destination location
  RETORNO = 'retorno',                 // Return trip
  ENTRE_PARADAS = 'entre_paradas',     // Between stops
  OTRO = 'otro',
}

@Entity({ name: 'segmentos_ruta', schema: 'tracking' })
@Index('idx_segmentos_ruta_tenant', ['tenantId'])
@Index('idx_segmentos_ruta_viaje', ['viajeId'])
@Index('idx_segmentos_ruta_unidad', ['unidadId'])
@Index('idx_segmentos_ruta_tipo', ['tipoSegmento'])
@Index('idx_segmentos_ruta_tiempo', ['tiempoInicio'])
export class SegmentoRuta {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  // Link to viaje (transport.viajes)
  @Column({ name: 'viaje_id', type: 'uuid', nullable: true })
  viajeId?: string;

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

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

  // Start/end positions
  @Column({ name: 'posicion_inicio_id', type: 'uuid', nullable: true })
  posicionInicioId?: string;

  @Column({ name: 'posicion_fin_id', type: 'uuid', nullable: true })
  posicionFinId?: string;

  // Coordinates (denormalized for quick access)
  @Column({ name: 'lat_inicio', type: 'decimal', precision: 10, scale: 7 })
  latInicio: number;

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

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

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

  // Distances
  @Column({ name: 'distancia_km', type: 'decimal', precision: 10, scale: 3 })
  distanciaKm: number;

  @Column({ name: 'distancia_cruda_km', type: 'decimal', precision: 10, scale: 3, nullable: true })
  distanciaCrudaKm?: number; // Before filters

  // Times
  @Column({ name: 'tiempo_inicio', type: 'timestamptz' })
  tiempoInicio: Date;

  @Column({ name: 'tiempo_fin', type: 'timestamptz' })
  tiempoFin: Date;

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

  // Segment type
  @Column({
    name: 'tipo_segmento',
    type: 'varchar',
    length: 30,
    default: TipoSegmento.OTRO,
  })
  tipoSegmento: TipoSegmento;

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

  @Column({ name: 'notas_validacion', type: 'text', nullable: true })
  notasValidacion?: string;

  // Encoded polyline for visualization
  @Column({ name: 'polyline_encoded', type: 'text', nullable: true })
  polylineEncoded?: string;

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

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

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

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

  @ManyToOne(() => PosicionGps, { nullable: true })
  @JoinColumn({ name: 'posicion_inicio_id' })
  posicionInicio?: PosicionGps;

  @ManyToOne(() => PosicionGps, { nullable: true })
  @JoinColumn({ name: 'posicion_fin_id' })
  posicionFin?: PosicionGps;
}
