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

/**
 * Tipo de Geocerca
 */
export enum TipoGeocerca {
  CIRCULAR = 'CIRCULAR',
  POLIGONAL = 'POLIGONAL',
  CLIENTE = 'CLIENTE',
  PROVEEDOR = 'PROVEEDOR',
  PATIO = 'PATIO',
  ZONA_RIESGO = 'ZONA_RIESGO',
  CASETA = 'CASETA',
  GASOLINERA = 'GASOLINERA',
  PUNTO_CONTROL = 'PUNTO_CONTROL',
  OTRO = 'OTRO',
}

@Entity({ schema: 'tracking', name: 'geocercas' })
@Index('idx_geocerca_tenant', ['tenantId'])
@Index('idx_geocerca_tipo', ['tenantId', 'tipo'])
export class Geocerca {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  // Identificación
  @Column({ type: 'varchar', length: 50 })
  codigo: string;

  @Column({ type: 'varchar', length: 200 })
  nombre: string;

  @Column({ type: 'enum', enum: TipoGeocerca })
  tipo: TipoGeocerca;

  // Geometría
  @Column({ name: 'es_circular', type: 'boolean', default: false })
  esCircular: boolean;

  // Para geocerca circular
  @Column({ name: 'centro_latitud', type: 'decimal', precision: 10, scale: 7, nullable: true })
  centroLatitud: number;

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

  @Column({ name: 'radio_metros', type: 'decimal', precision: 10, scale: 2, nullable: true })
  radioMetros: number;

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

  // Para geocerca poligonal (GeoJSON como string)
  @Column({ type: 'text', nullable: true })
  poligono: string;

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

  // Asociación
  @Column({ name: 'cliente_id', type: 'uuid', nullable: true })
  clienteId: string;

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

  // Alertas
  @Column({ name: 'alerta_entrada', type: 'boolean', default: true })
  alertaEntrada: boolean;

  @Column({ name: 'alerta_salida', type: 'boolean', default: true })
  alertaSalida: boolean;

  @Column({ name: 'tiempo_permanencia_minutos', type: 'int', nullable: true })
  tiempoPermanenciaMinutos: number;

  // Configuración
  @Column({ type: 'varchar', length: 7, default: '#FF0000' })
  color: string;

  @Column({ type: 'boolean', default: true })
  activa: boolean;

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

  @Column({ name: 'created_by_id', type: 'uuid' })
  createdById: string;

  @UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
  updatedAt: Date;
}
