import { Injectable } from '@angular/core';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';

export interface Paciente {
  interno: string;
  tipo_documento: string | null;
  numero_documento: string | null;
  primer_apellido: string | null;
  segundo_apellido: string | null;
  primer_nombre: string | null;
  segundo_nombre: string | null;
  fecha_nacimiento: string | null;
  edad: number | null;
  sexo: string | null;

  // Campos que vienen del JOIN con ingreso + establecimiento
  nombre_establecimiento?: string | null;
  estado?: string | null;
  fecha_ingreso?: string | null;
  tiempo_reclusion?: number | null;
}

export interface Ips {
  id_ips: number;
  nombre_ips: string;
  nit?: string;
  direccion?: string;
  municipio?: string;
  departamento?: string;
}

export interface Autorizante {
  numero_documento: number;
  tipo_documento: string;
  nombre: string;
  telefono?: string;
  cargo?: string;
  activo: boolean;
}

export interface RespuestaAutorizacion {
  numero_autorizacion: string;
  fecha_autorizacion: string;
}

export interface AutorizacionListado {
  numero_autorizacion: string;
  fecha_autorizacion: string;
  nombre_ips: string;
  nombre_autorizante: string;
}

@Injectable({ providedIn: 'root' })
export class PacienteService {
  // Ajusta si usas otra URL base
  private readonly baseUrl = 'http://localhost:3000';

  constructor(private http: HttpClient) {}

  // ---- Búsquedas de pacientes ----
  buscarPorDocumento(numero_documento: string): Observable<Paciente[]> {
    const params = new HttpParams().set('numero_documento', numero_documento);
    return this.http.get<Paciente[]>(`${this.baseUrl}/api/pacientes`, {
      params,
    });
  }

  buscarPorInterno(interno: string): Observable<Paciente[]> {
    const params = new HttpParams().set('interno', interno);
    return this.http.get<Paciente[]>(`${this.baseUrl}/api/pacientes`, {
      params,
    });
  }

  buscarPorNombre(nombre: string): Observable<Paciente[]> {
    const params = new HttpParams().set('nombre', nombre);
    return this.http.get<Paciente[]>(`${this.baseUrl}/api/pacientes`, {
      params,
    });
  }

  // ---- IPS y autorizantes ----
  obtenerIpsPorInterno(interno: string): Observable<Ips[]> {
    const params = new HttpParams().set('interno', interno);
    return this.http.get<Ips[]>(`${this.baseUrl}/api/ips-por-interno`, {
      params,
    });
  }

  obtenerAutorizantes(): Observable<Autorizante[]> {
    return this.http.get<Autorizante[]>(`${this.baseUrl}/api/autorizantes`);
  }

  // ---- Autorizaciones ----
  crearAutorizacion(payload: {
    numero_autorizacion: string;
    interno: string;
    id_ips: number;
    numero_documento_autorizante: number;
    observacion?: string;
    fecha_autorizacion?: string;
  }): Observable<RespuestaAutorizacion> {
    return this.http.post<RespuestaAutorizacion>(
      `${this.baseUrl}/api/autorizaciones`,
      payload
    );
  }

  obtenerAutorizacionesPorInterno(
    interno: string
  ): Observable<AutorizacionListado[]> {
    const params = new HttpParams().set('interno', interno);
    return this.http.get<AutorizacionListado[]>(
      `${this.baseUrl}/api/autorizaciones`,
      { params }
    );
  }

  // ---- Cargar Excel (Python + SQL) ----
  cargarExcelPacientes(formData: FormData): Observable<{
    ok: boolean;
    mensaje: string;
    activos: number;
    antiguos: number;
  }> {
    return this.http.post<{
      ok: boolean;
      mensaje: string;
      activos: number;
      antiguos: number;
    }>(`${this.baseUrl}/api/cargar-excel-pacientes`, formData);
  }
}
