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 } from '../../services/job-types';

@Component({
  selector: 'app-cargar-pacientes',
  standalone: true,
  imports: [CommonModule, AppHeaderComponent],
  templateUrl: './cargar-pacientes.html',
  styleUrls: ['./cargar-pacientes.css']
})
export class CargarPacientesComponent implements OnInit {
  archivoFile: File | null = null;
  isLoading = false;
  statusMessage: string | null = null;
  errorMessage: string | null = null;
  resumen: JobResult | null = null;

  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();
  }

  onArchivoSelected(event: Event): void {
    const input = event.target as HTMLInputElement;
    this.archivoFile = input.files?.[0] || null;
    this.limpiarMensajes();
    this.resumen = null;
  }

  procesarPacientes(input?: HTMLInputElement): void {
    this.limpiarMensajes();
    this.resumen = null;

    if (!this.archivoFile) {
      this.errorMessage = 'Debes seleccionar el archivo Excel de pacientes.';
      return;
    }

    this.isLoading = true;
    this.statusMessage = 'Subiendo archivo...';

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

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

        this.jobsService.pollJob(job.id).subscribe({
          next: (estado) => {
            if (estado.status === 'completed') {
              this.resumen = estado.result || null;
              const partes: string[] = [];
              if (estado.result?.mensaje) {
                partes.push(estado.result.mensaje);
              }
              if (typeof estado.result?.activos === 'number') {
                partes.push(`Pacientes activos: ${estado.result.activos}`);
              }
              if (typeof estado.result?.antiguos === 'number') {
                partes.push(`Pacientes antiguos: ${estado.result.antiguos}`);
              }
              this.statusMessage =
                partes.join(' - ') || 'Pacientes cargados correctamente.';
              this.isLoading = false;
            }

            if (estado.status === 'failed') {
              this.errorMessage =
                estado.error?.message || 'Error procesando el Excel de pacientes.';
              this.isLoading = false;
            }

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

  private limpiarMensajes(): void {
    this.statusMessage = null;
    this.errorMessage = null;
  }
}
