/* eslint-disable @typescript-eslint/no-explicit-any */
import React from "react";
import { useCart } from "@/context/CartContext";
import { useSiteConfig } from "@/context/SiteConfigContext";

interface OrderCalculationsProps {
  pointsDiscount?: number;
  isEmi?: boolean;
  emiTenure?: number;
  emiDownPayment?: number;
  emiBase?: number;
  cashShare?: number;
}

export default function OrderCalculations({
  pointsDiscount = 0,
  isEmi = false,
  emiTenure = 3,
  emiDownPayment = 0,
  emiBase = 0,
  cashShare = 0,
}: OrderCalculationsProps) {
  const { calculations, coupon, paymentMethod } = useCart();
  const config = useSiteConfig();
  const defaultInterestRate = Math.max(0, parseFloat(config.emi_interest_rate || "0") || 0);

  const tenureRates: Record<number, number> = React.useMemo(() => {
    if (!config.emi_tenure_rates) return {};
    try {
      const parsed = typeof config.emi_tenure_rates === "string" ? JSON.parse(config.emi_tenure_rates) : config.emi_tenure_rates;
      if (Array.isArray(parsed)) {
        const map: Record<number, number> = {};
        parsed.forEach((it: any) => {
          const m = Number(it.months || it.tenure);
          const r = Number(it.rate ?? it.interest_rate);
          if (m > 0 && !isNaN(r)) map[m] = r;
        });
        return map;
      } else if (typeof parsed === "object" && parsed !== null) {
        const map: Record<number, number> = {};
        Object.entries(parsed).forEach(([k, v]) => {
          const m = Number(k);
          const r = Number(v);
          if (m > 0 && !isNaN(r)) map[m] = r;
        });
        return map;
      }
    } catch (e) { }
    return {};
  }, [config.emi_tenure_rates]);

  const tenureN = emiTenure > 0 ? emiTenure : 3;
  const currentInterestRate = tenureRates[tenureN] !== undefined ? tenureRates[tenureN] : defaultInterestRate;

  // EMI base = EMI-eligible items only, coupon-only discount (points never reduce principal)
  const emiBaseN = Math.max(0, emiBase);
  const cashShareN = Math.max(0, cashShare);
  const deliveryAndCod = calculations.deliveryCharge + (paymentMethod === "cod" ? calculations.codCharge : 0);
  const baseTotal = isEmi ? emiBaseN : Math.max(0, calculations.total - pointsDiscount);
  const emiCharge = isEmi ? Math.round(((emiBaseN * currentInterestRate) / 100) * 100) / 100 : 0;
  const emiGrandTotal = isEmi ? Math.round((emiBaseN + emiCharge) * 100) / 100 : baseTotal;
  const emiDpN = isEmi ? Math.min(Math.max(0, Number(emiDownPayment || 0)), emiGrandTotal) : 0;
  const emiFinanced = isEmi ? Math.max(0, Math.round((emiGrandTotal - emiDpN) * 100) / 100) : 0;
  const installmentCount = tenureN;
  const emiMonthly = isEmi
    ? (installmentCount > 0 ? Math.round((emiFinanced / installmentCount) * 100) / 100 : 0)
    : 0;
  const firstInstallment = isEmi ? emiDpN : 0;

  return (
    <div className="border-t border-slate-100 dark:border-zinc-800 pt-4 space-y-2.5 text-xs">
      <div className="flex justify-between text-slate-500">
        <span>Subtotal</span>
        <span className="font-bold text-slate-800 dark:text-zinc-200">
          ৳{calculations.subtotal.toFixed(2)}
        </span>
      </div>
      {calculations.couponDiscount > 0 && (
        <div className="flex justify-between text-emerald-600 dark:text-emerald-500">
          <span className="font-semibold flex items-center gap-1">
            Coupon
            {coupon?.code && (
              <span className="bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-400 text-[9px] font-black px-1.5 py-px rounded tracking-wide uppercase">
                {coupon.code}
              </span>
            )}
          </span>
          <span className="font-bold">-৳{calculations.couponDiscount.toFixed(2)}</span>
        </div>
      )}

      {pointsDiscount > 0 && (
        <div className="flex justify-between text-amber-600 dark:text-amber-400 font-semibold">
          <span>Points Discount</span>
          <span className="font-bold">-৳{pointsDiscount.toFixed(2)}</span>
        </div>
      )}

      <div className="flex justify-between items-start text-slate-500">
        <span>Delivery Charge</span>
        <div className="text-right">
          {calculations.deliveryCharge === 0 ? (
            <span className="font-black text-emerald-600 dark:text-emerald-500 border border-emerald-500 rounded px-1.5 py-0.5 text-[9px] uppercase tracking-wide">
              {coupon?.discount_type === "free_delivery" ? "FREE (COUPON)" : "FREE"}
            </span>
          ) : (
            <span className="font-bold text-slate-800 dark:text-zinc-200 block">
              ৳{calculations.deliveryCharge.toFixed(2)}
            </span>
          )}
        </div>
      </div>

      {paymentMethod === "cod" && calculations.codCharge > 0 && (
        <div className="flex justify-between items-start text-slate-500">
          <span>COD Charge</span>
          <div className="text-right">
            <span className="font-bold text-slate-800 dark:text-zinc-200 block">
              ৳{calculations.codCharge.toFixed(2)}
            </span>
          </div>
        </div>
      )}

      {isEmi && (
        <>
          {cashShareN > 0 && (
            <div className="flex justify-between text-slate-500">
              <span>Cash Items (paid now)</span>
              <span className="font-bold text-slate-800 dark:text-zinc-200">৳{cashShareN.toFixed(2)}</span>
            </div>
          )}
          {emiCharge > 0 && (
            <div className="flex justify-between text-indigo-600 dark:text-indigo-400 font-semibold">
              <span>EMI Fee ({currentInterestRate}%)</span>
              <span className="font-bold">+৳{emiCharge.toFixed(2)}</span>
            </div>
          )}
          <div className="flex justify-between text-slate-700 dark:text-zinc-300 font-bold border-t border-slate-100 dark:border-zinc-800 pt-2">
            <span>Grand Total (with EMI)</span>
            <span>৳{emiGrandTotal.toFixed(2)}</span>
          </div>
          <div className="flex justify-between text-indigo-600 dark:text-indigo-400 font-medium">
            <span>Financed ({emiDpN === 0 ? tenureN - 1 : tenureN}x Remaining)</span>
            <span className="font-bold">৳{emiMonthly.toFixed(2)} / mo</span>
          </div>
        </>
      )}

      <div className="flex justify-between items-baseline text-base font-extrabold border-t border-dashed border-slate-200 dark:border-zinc-800 pt-3 text-slate-950 dark:text-zinc-100">
        <span>
          {isEmi
            ? "Payable Now (Installment + Cash Items + Delivery)"
            : "Total Payable"}
        </span>
        <div className="text-right">
          <span className={isEmi ? "text-emerald-600 dark:text-emerald-400 font-black text-lg" : ""}>
            ৳{(isEmi ? firstInstallment + cashShareN + deliveryAndCod - pointsDiscount : baseTotal).toFixed(2)}
          </span>
          {!isEmi && (calculations.couponDiscount > 0 || pointsDiscount > 0) && (
            <span className="block text-xs text-slate-400 line-through font-normal">
              ৳{(calculations.subtotal + calculations.deliveryCharge + (paymentMethod === "cod" ? calculations.codCharge : 0)).toFixed(2)}
            </span>
          )}
          {isEmi && (
            <span className="block text-[10px] text-slate-400 font-normal">
              {installmentCount}× remaining installments of ৳{emiMonthly.toFixed(2)}/mo
            </span>
          )}
        </div>
      </div>
    </div>
  );
}
