import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Router } from '@angular/router';
import { AppHeaderComponent } from '../shared/app-header/app-header';
import { AuthService } from '../../services/auth';
import { PacienteService } from '../../services/paciente';
import { JobsService } from '../../services/jobs';
import { JobResult, JobRowError } from '../../services/job-types';

@Component({
  selector: 'app-cargar-ips-reps',
  standalone: true,
  imports: [CommonModule, AppHeaderComponent],
  templateUrl: './cargar-ips-reps.html',
  styleUrls: ['./cargar-ips-reps.css']
})
export class CargarIpsRepsComponent implements OnInit {
  ipsFile: File | null = null;
  repsFile: File | null = null;

  isLoadingIps = false;
  isLoadingReps = false;

  statusIps: string | null = null;
  statusReps: string | null = null;
  errorIps: string | null = null;
  errorReps: string | null = null;

  ipsResumen: JobResult | null = null;
  repsResumen: JobResult | null = null;
  ipsErrores: JobRowError[] = [];

  constructor(
    private authService: AuthService,
    private pacienteService: PacienteService,
    private jobsService: JobsService,
    private router: Router,
    private cdr: ChangeDetectorRef
  ) {}

  ngOnInit(): void {
    if (!this.authService.isAdministrador()) {
      this.router.navigate(['/dashboard']);
    }
  }

  volverDashboard(): void {
    this.router.navigate(['/dashboard']);
  }

  logout(): void {
    this.authService.logout();
  }

  isLoggedIn(): boolean {
    return this.authService.isLoggedIn();
  }

  getCurrentUser(): any {
    return this.authService.getCurrentUser();
  }

  onIpsSelected(event: Event): void {
    const input = event.target as HTMLInputElement;
    this.ipsFile = input.files?.[0] || null;
    this.limpiarIps();
    this.ipsResumen = null;
    this.ipsErrores = [];
  }

  onRepsSelected(event: Event): void {
    const input = event.target as HTMLInputElement;
    this.repsFile = input.files?.[0] || null;
    this.limpiarReps();
    this.repsResumen = null;
  }

  procesarIps(input?: HTMLInputElement): void {
    this.limpiarIps();
    this.ipsResumen = null;
    this.ipsErrores = [];

    if (!this.ipsFile) {
      this.errorIps = 'Debes seleccionar el archivo Excel de IPS.';
      return;
    }

    this.isLoadingIps = true;
    this.statusIps = 'Subiendo archivo...';

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

    this.pacienteService.cargarIps(formData).subscribe({
      next: (job) => {
        this.statusIps = 'Archivo en cola. Procesando...';
        if (input) {
          input.value = '';
        }

        this.jobsService.pollJob(job.id).subscribe({
          next: (estado) => {
            if (estado.status === 'completed') {
              this.ipsResumen = estado.result || null;
              this.ipsErrores = Array.isArray(estado.result?.errores)
                ? estado.result?.errores || []
                : [];
              this.statusIps = estado.result?.mensaje || 'IPS cargadas correctamente.';
              this.isLoadingIps = false;
            }

            if (estado.status === 'failed') {
              this.errorIps =
                estado.error?.message || 'Error procesando el Excel de IPS.';
              this.isLoadingIps = false;
            }

            this.cdr.detectChanges();
          },
          error: (error) => {
            console.error(error);
            this.errorIps =
              'Error consultando el estado de la carga de IPS.';
            this.isLoadingIps = false;
            this.cdr.detectChanges();
          }
        });
      },
      error: (err) => {
        console.error(err);
        this.errorIps =
          err?.error?.error || 'Error subiendo el Excel de IPS.';
        this.isLoadingIps = false;
        this.cdr.detectChanges();
      }
    });
  }

  procesarReps(input?: HTMLInputElement): void {
    this.limpiarReps();
    this.repsResumen = null;

    if (!this.repsFile) {
      this.errorReps = 'Debes seleccionar el archivo Excel de REPS.';
      return;
    }

    this.isLoadingReps = true;
    this.statusReps = 'Subiendo archivo...';

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

    this.pacienteService.cargarReps(formData).subscribe({
      next: (job) => {
        this.statusReps = 'Archivo en cola. Procesando...';
        if (input) {
          input.value = '';
        }

        this.jobsService.pollJob(job.id).subscribe({
          next: (estado) => {
            if (estado.status === 'completed') {
              this.repsResumen = estado.result || null;
              this.statusReps = estado.result?.mensaje || 'REPS cargados correctamente.';
              this.isLoadingReps = false;
            }

            if (estado.status === 'failed') {
              this.errorReps =
                estado.error?.message || 'Error procesando el Excel de REPS.';
              this.isLoadingReps = false;
            }

            this.cdr.detectChanges();
          },
          error: (error) => {
            console.error(error);
            this.errorReps =
              'Error consultando el estado de la carga de REPS.';
            this.isLoadingReps = false;
            this.cdr.detectChanges();
          }
        });
      },
      error: (err) => {
        console.error(err);
        this.errorReps =
          err?.error?.error || 'Error subiendo el Excel de REPS.';
        this.isLoadingReps = false;
        this.cdr.detectChanges();
      }
    });
  }

  private limpiarIps(): void {
    this.statusIps = null;
    this.errorIps = null;
  }

  private limpiarReps(): void {
    this.statusReps = null;
    this.errorReps = null;
  }
}
