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';

@Component({
  selector: 'app-cargar-cups',
  standalone: true,
  imports: [CommonModule, AppHeaderComponent],
  templateUrl: './cargar-cups.html',
  styleUrls: ['./cargar-cups.css']
})
export class CargarCupsComponent implements OnInit {
  notaFile: File | null = null;
  referenciaFile: File | null = null;
  isLoading = false;
  statusMessage: string | null = null;
  errorMessage: string | 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();
  }

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

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

  procesarCups(): void {
    this.limpiarMensajes();

    if (!this.notaFile || !this.referenciaFile) {
      this.errorMessage = 'Debes seleccionar los dos archivos de CUPS.';
      return;
    }

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

    const formData = new FormData();
    formData.append('nota_tecnica', this.notaFile);
    formData.append('tabla_referencia', this.referenciaFile);

    this.pacienteService.cargarExcelCups(formData).subscribe({
      next: (job) => {
        this.statusMessage = 'Archivos en cola. Procesando...';
        this.cdr.detectChanges();

        this.jobsService.pollJob(job.id).subscribe({
          next: (estado) => {
            if (estado.status === 'completed') {
              const partes: string[] = [];
              if (estado.result?.mensaje) {
                partes.push(estado.result.mensaje);
              }
              if (typeof estado.result?.referencia === 'number') {
                partes.push(`CUPS referencia: ${estado.result.referencia}`);
              }
              if (typeof estado.result?.cubiertosActivos === 'number') {
                partes.push(`CUPS cubiertos activos: ${estado.result.cubiertosActivos}`);
              }

              this.statusMessage =
                partes.join(' - ') || 'CUPS procesados correctamente.';
              this.isLoading = false;
            }

            if (estado.status === 'failed') {
              this.errorMessage =
                estado.error?.message || 'Error procesando los archivos de CUPS.';
              this.isLoading = false;
            }

            this.cdr.detectChanges();
          },
          error: (error) => {
            console.error(error);
            this.errorMessage =
              'Error consultando el estado del procesamiento de CUPS.';
            this.isLoading = false;
            this.cdr.detectChanges();
          }
        });
      },
      error: (err) => {
        console.error(err);
        this.errorMessage =
          err?.error?.error || 'Error subiendo los archivos de CUPS.';
        this.isLoading = false;
        this.cdr.detectChanges();
      }
    });
  }

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