import { ChangeDetectorRef, Component } 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-autorizaciones-masivas',
  standalone: true,
  imports: [CommonModule, AppHeaderComponent],
  templateUrl: './cargar-autorizaciones-masivas.html',
  styleUrls: ['./cargar-autorizaciones-masivas.css']
})
export class CargarAutorizacionesMasivasComponent {
  archivoFile: File | null = null;
  isLoading = false;
  statusMessage: string | null = null;
  errorMessage: string | null = null;
  resumen: JobResult | null = null;
  errores: JobRowError[] = [];

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

  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;
    this.errores = [];
  }

  procesarMasivo(input?: HTMLInputElement): void {
    this.limpiarMensajes();
    this.resumen = null;
    this.errores = [];

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

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

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

    this.pacienteService.cargarAutorizacionesMasivas(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;
              this.errores = Array.isArray(estado.result?.errores)
                ? estado.result?.errores || []
                : [];
              this.statusMessage =
                estado.result?.mensaje || 'Carga masiva finalizada.';
              this.isLoading = false;
            }

            if (estado.status === 'failed') {
              this.errorMessage =
                estado.error?.message ||
                'Error procesando autorizaciones masivas.';
              this.isLoading = false;
            }

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

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