import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

export interface EstadoImportacion {
  planilla_cargada: boolean;
  histor_cargada: boolean;
  planilla_nombre: string | null;
  histor_nombre: string | null;
  ultima_sync: string | null;
  ultima_sync_resultado?: any;
}

export interface RespuestaImportacion {
  ok: boolean;
  mensaje: string;
  stdout?: string;
  stderr?: string;
  detalle?: any;
  resultado?: any;
}

export interface HistGeneralEspecialidad {
  especialidad: string;
  esperado: number;
  asistidas: number;
  pendientes: number;
  porcentaje: number;
}

export interface HistGeneralMesPrograma {
  mes: number;
  esperado: number;
  asistidas: number;
  // opcionales por si luego los quieres mostrar
  retraso?: number;
  pendientes?: number;
}

export interface HistogramaGeneral {
  pacientes_incluidos: number;
  rango: { inicio: string | null; hoy: string };
  total_esperado: number;
  total_asistidas: number;
  porcentaje: number;
  porEspecialidad: HistGeneralEspecialidad[];
  porMesPrograma: HistGeneralMesPrograma[];
}

export interface HistPacienteMes {
  mes: number;
  inicio: string;
  fin: string;

  // compat
  esperado?: number;
  asistidas?: number;
  pendientes?: number;

  // nuevos (si vienen del backend)
  esperado_mes?: number;
  asistidas_mes?: number;
  asistidas_arrastre?: number;
  asistidas_total?: number;
  retraso_fin?: number;
}

export interface HistogramaPaciente {
  numero_documento: string;
  ingreso: { fecha: string; fuente: string };
  ventana: { inicio: string; fin: string; mes_programa: number };
  cumplimiento: {
    esperado_mes_actual: number;
    asistidas_mes_actual: number;
    porcentaje_mes_actual: number;

    // ✅ NUEVOS (tu backend actualizado)
    esperado_base_hasta_hoy?: number;
    asistidas_plan_hasta_hoy?: number;
    porcentaje_base_hasta_hoy?: number;

    // (info adicional si lo usas)
    asistidas_arrastre_mes_actual?: number;
    asistidas_total_mes_actual?: number;
    retraso_actual?: number;

    // ✅ VIEJOS (por si algún endpoint todavía lo devuelve)
    esperado_hasta_hoy?: number;
    asistidas_hasta_hoy?: number;
    porcentaje_hasta_hoy?: number;
  };
  porMes: HistPacienteMes[];
  extras?: Array<{ mes: number; fecha: string; especialidad: string }>;
}

export interface ImportLog {
  running: boolean;
  inicio: string | null;
  fin: string | null;
  lines: string[];
}

@Injectable({ providedIn: 'root' })
export class ImportacionService {
  private baseUrl = 'http://localhost:2800';

  constructor(private http: HttpClient) {}

  estado(): Observable<EstadoImportacion> {
    return this.http.get<EstadoImportacion>(`${this.baseUrl}/api/importacion/estado`);
  }

  subirPlanilla(file: File): Observable<RespuestaImportacion> {
    const form = new FormData();
    form.append('file', file);
    return this.http.post<RespuestaImportacion>(`${this.baseUrl}/api/importacion/planilla`, form);
  }

  subirHistor(file: File): Observable<RespuestaImportacion> {
    const form = new FormData();
    form.append('file', file);
    return this.http.post<RespuestaImportacion>(`${this.baseUrl}/api/importacion/histor`, form);
  }

  // ✅ Procesar cuando tú quieras (endpoint nuevo)
  sincronizar(): Observable<RespuestaImportacion> {
    return this.http.post<RespuestaImportacion>(`${this.baseUrl}/api/importacion/sincronizar`, {});
  }

  limpiar(): Observable<{ ok: boolean; mensaje: string }> {
    return this.http.post<{ ok: boolean; mensaje: string }>(`${this.baseUrl}/api/importacion/limpiar`, {});
  }

  log(): Observable<ImportLog> {
    return this.http.get<ImportLog>(`${this.baseUrl}/api/importacion/log`);
  }

  histogramaGeneral(): Observable<HistogramaGeneral> {
    return this.http.get<HistogramaGeneral>(`${this.baseUrl}/api/histogramas/general`);
  }

  histogramaPaciente(numeroDocumento: string): Observable<HistogramaPaciente> {
    return this.http.get<HistogramaPaciente>(`${this.baseUrl}/api/histogramas/paciente/${numeroDocumento}`);
  }
}
