import { Component, ChangeDetectorRef } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import {
  PacienteService,
  Paciente,
  Ips,
  Autorizante,
  RespuestaAutorizacion,
  AutorizacionListado,
} from './services/paciente';
import { finalize } from 'rxjs/operators';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [CommonModule, FormsModule],
  templateUrl: './app.html',
  styleUrls: ['./app.css'],
})
export class AppComponent {
  titulo = 'Consulta PPL INPEC';

  // ---- Búsqueda ----
  tipoBusqueda: 'documento' | 'interno' | 'nombre' = 'documento';
  termino = '';

  pacientes: Paciente[] = [];
  cargando = false;
  error: string | null = null;

  // ---- Excel ----
  cargandoExcel = false;
  estadoCargaExcel: string | null = null;

  // ---- Autorizaciones ----
  pacienteSeleccionado: Paciente | null = null;
  ipsDisponibles: Ips[] = [];
  autorizantes: Autorizante[] = [];

  formAutorizacion = {
    numero_autorizacion: '',
    id_ips: '',
    numero_documento_autorizante: '',
    fecha_autorizacion: '',
    observacion: '',
  };

  guardandoAutorizacion = false;
  mensajeAutorizacion: string | null = null;
  errorAutorizacion: string | null = null;

  autorizacionesPaciente: AutorizacionListado[] = [];
  cargandoAutorizaciones = false;
  errorAutLista: string | null = null;

  constructor(
    private pacienteService: PacienteService,
    private cdr: ChangeDetectorRef
  ) {}

  // -------------------------
  // Búsqueda de pacientes
  // -------------------------
  buscar(): void {
    this.error = null;
    this.cargando = true;
    this.pacientes = [];
    this.pacienteSeleccionado = null;
    this.mensajeAutorizacion = null;
    this.errorAutorizacion = null;

    const valor = this.termino.trim();
    if (!valor) {
      this.cargando = false;
      this.error = 'Ingrese un valor para buscar.';
      return;
    }

    let obs$;

    if (this.tipoBusqueda === 'documento') {
      obs$ = this.pacienteService.buscarPorDocumento(valor);
    } else if (this.tipoBusqueda === 'interno') {
      obs$ = this.pacienteService.buscarPorInterno(valor);
    } else {
      obs$ = this.pacienteService.buscarPorNombre(valor);
    }

    obs$
      .pipe(
        finalize(() => {
          this.cargando = false;
          this.cdr.markForCheck();
        })
      )
      .subscribe({
        next: (data: Paciente[]) => {
          this.pacientes = data;
        },
        error: (err) => {
          console.error(err);
          this.error = 'Error consultando pacientes.';
        },
      });
  }

  // -------------------------
  // Cargar Excel (botón)
  // -------------------------
  onExcelSelected(event: Event): void {
    const input = event.target as HTMLInputElement;
    const file = input.files?.[0];
    if (!file) return;

    this.cargandoExcel = true;
    this.estadoCargaExcel = null;

    const formData = new FormData();
    formData.append('archivo', file);

    this.pacienteService
      .cargarExcelPacientes(formData)
      .pipe(
        finalize(() => {
          this.cargandoExcel = false;
          this.cdr.markForCheck();
          input.value = '';
        })
      )
      .subscribe({
        next: (resp) => {
          this.estadoCargaExcel = `${resp.mensaje}. Vigentes: ${resp.activos}, antiguos: ${resp.antiguos}.`;
          // Refrescar la tabla con el último criterio si había algo
          if (this.termino) {
            this.buscar();
          }
        },
        error: (err) => {
          console.error(err);
          this.estadoCargaExcel =
            err.error?.error || 'Error cargando el archivo Excel.';
        },
      });
  }

  // -------------------------
  // Seleccionar paciente
  // -------------------------
  seleccionarPaciente(p: Paciente): void {
    this.pacienteSeleccionado = p;
    this.mensajeAutorizacion = null;
    this.errorAutorizacion = null;

    this.formAutorizacion = {
      numero_autorizacion: '',
      id_ips: '',
      numero_documento_autorizante: '',
      fecha_autorizacion: '',
      observacion: '',
    };

    this.autorizacionesPaciente = [];
    this.errorAutLista = null;

    this.cargarIps(p.interno);
    this.cargarAutorizantes();
  }

  cerrarAutorizacion(): void {
    this.pacienteSeleccionado = null;
    this.autorizacionesPaciente = [];
    this.mensajeAutorizacion = null;
    this.errorAutorizacion = null;
    this.errorAutLista = null;
    this.cdr.markForCheck();
  }

  private cargarIps(interno: string): void {
    this.ipsDisponibles = [];
    this.pacienteService
      .obtenerIpsPorInterno(interno)
      .pipe(
        finalize(() => {
          this.cdr.markForCheck();
        })
      )
      .subscribe({
        next: (data: Ips[]) => {
          this.ipsDisponibles = data;
        },
        error: (err) => {
          console.error(err);
          this.errorAutorizacion =
            'No se pudieron cargar las IPS para este interno.';
        },
      });
  }

  private cargarAutorizantes(): void {
    this.autorizantes = [];
    this.pacienteService
      .obtenerAutorizantes()
      .pipe(
        finalize(() => {
          this.cdr.markForCheck();
        })
      )
      .subscribe({
        next: (data: Autorizante[]) => {
          this.autorizantes = data;
        },
        error: (err) => {
          console.error(err);
          this.errorAutorizacion =
            'No se pudieron cargar las personas autorizantes.';
        },
      });
  }

  // -------------------------
  // Guardar autorización
  // -------------------------
  guardarAutorizacion(): void {
    if (!this.pacienteSeleccionado) {
      return;
    }

    this.errorAutorizacion = null;
    this.mensajeAutorizacion = null;

    if (!this.formAutorizacion.numero_autorizacion.trim()) {
      this.errorAutorizacion = 'Debe ingresar el número de autorización.';
      return;
    }

    if (!this.formAutorizacion.id_ips) {
      this.errorAutorizacion = 'Debe seleccionar una IPS.';
      return;
    }
    if (!this.formAutorizacion.numero_documento_autorizante) {
      this.errorAutorizacion = 'Debe seleccionar quién autoriza.';
      return;
    }

    const payload = {
      numero_autorizacion: this.formAutorizacion.numero_autorizacion.trim(),
      interno: this.pacienteSeleccionado.interno,
      id_ips: Number(this.formAutorizacion.id_ips),
      numero_documento_autorizante: Number(
        this.formAutorizacion.numero_documento_autorizante
      ),
      observacion: this.formAutorizacion.observacion,
      fecha_autorizacion:
        this.formAutorizacion.fecha_autorizacion || undefined,
    };

    this.guardandoAutorizacion = true;

    this.pacienteService
      .crearAutorizacion(payload)
      .pipe(
        finalize(() => {
          this.guardandoAutorizacion = false;
          this.cdr.markForCheck();
        })
      )
      .subscribe({
        next: (resp: RespuestaAutorizacion) => {
          this.mensajeAutorizacion = `Autorización N° ${resp.numero_autorizacion} creada el ${resp.fecha_autorizacion}.`;
        },
        error: (err) => {
          console.error(err);
          this.errorAutorizacion =
            err.error?.error || 'Error guardando la autorización.';
        },
      });
  }

  // -------------------------
  // Ver autorizaciones del interno
  // -------------------------
  verAutorizaciones(): void {
    if (!this.pacienteSeleccionado) return;

    this.cargandoAutorizaciones = true;
    this.errorAutLista = null;
    this.autorizacionesPaciente = [];

    this.pacienteService
      .obtenerAutorizacionesPorInterno(this.pacienteSeleccionado.interno)
      .pipe(
        finalize(() => {
          this.cargandoAutorizaciones = false;
          this.cdr.markForCheck();
        })
      )
      .subscribe({
        next: (data: AutorizacionListado[]) => {
          this.autorizacionesPaciente = data;
        },
        error: (err) => {
          console.error(err);
          this.errorAutLista = 'Error consultando autorizaciones.';
        },
      });
  }

  // -------------------------
  // Descargar PDF
  // -------------------------
  descargarPdf(numero_autorizacion: string): void {
    window.open(
      `http://localhost:3000/api/generar-pdf-autorizacion?numero_autorizacion=${encodeURIComponent(
        numero_autorizacion
      )}`,
      '_blank'
    );
  }
}
