import { parseServicePaymentNotes } from "@/lib/service-payment-meta";
import type { PagoServicio, PagoServicioRow, GastoEntry } from "./types";

export function formatARS(n: number): string {
  return "$" + n.toLocaleString("es-AR", { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}

export function formatPeriodo(p: string): string {
  const [anio, mes] = p.split("-");
  const meses = ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"];
  return `${meses[parseInt(mes) - 1]} ${anio}`;
}

export function sortArrow(active: boolean, direction: "asc" | "desc"): string {
  if (!active) return "";
  return direction === "asc" ? " ▲" : " ▼";
}

export function normalizePagoServicio(pago: PagoServicio): PagoServicioRow {
  const parsed = parseServicePaymentNotes(pago.notas);
  const displayCreadoPor = pago.creadoPor && pago.creadoPor !== "bot-whatsapp"
    ? pago.creadoPor
    : parsed.meta.uploader || pago.creadoPor || "—";

  return {
    ...pago,
    displayNotas: parsed.displayText || "—",
    displayCreadoPor,
    proofUrls: parsed.meta.proofUrls ?? [],
  };
}

export function diasEntreFechas(desde: string, hasta: string): number {
  const d1 = new Date(desde + "T00:00:00");
  const d2 = new Date(hasta + "T00:00:00");
  return Math.max(0, Math.floor((d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24)));
}

function getVencimiento(periodo: string, diaVencimiento: number): string {
  const [anio, mes] = periodo.split("-").map(Number);
  const ultimoDia = new Date(anio, mes, 0).getDate();
  const diaVenc = Math.min(diaVencimiento, ultimoDia);
  return `${periodo}-${String(diaVenc).padStart(2, "0")}`;
}

interface EntryWithDirty extends GastoEntry {
  montoFacturado: number;
  montoPagado: number;
  fechaPago: string | null;
  notas: string | null;
}

export interface PenaltyInfo {
  diasMora: number;
  penalidad: number;
}

export function getEntryPenalty(
  entry: EntryWithDirty,
  porcentajeServicio: number,
  penalDiario: number,
  diaVencimiento: number,
  hoy: string,
): PenaltyInfo {
  const corresponde = Math.round(entry.montoFacturado * porcentajeServicio * 100) / 100;
  const vencimiento = getVencimiento(entry.periodo, diaVencimiento);
  const montoPagado = entry.montoPagado ?? 0;

  let diasMora = 0;
  if (montoPagado >= corresponde) {
    if (entry.fechaPago && entry.fechaPago > vencimiento) {
      diasMora = diasEntreFechas(vencimiento, entry.fechaPago);
    }
  } else if (hoy > vencimiento) {
    diasMora = diasEntreFechas(vencimiento, hoy);
  }

  const penalidad = diasMora > 0 ? Math.round(corresponde * penalDiario * diasMora) : 0;
  return { diasMora, penalidad };
}
