import { useEffect, useState, useCallback } from "react";

export interface SentLead {
    genTimestamp: string;
    enqDateTime: string;
    enquiryId: string;
    clientName: string;
    mobile: string;
    email: string;
    subject: string;
    notes: string;
    ivrUrl: string;
    websiteName: string;
    dataSource: { label: string; color: any };
    campaignId: string;
    campaignName: string;
    assignTo: string;
    kserveResponse: string;
    kserveError: boolean;
    transferTo: string;
    statusCode: string;
    status: { label: string; dot: any; color: any };
    company: string;
    region: string;
}

const CACHE_KEY = "sent_leads_cache";
const CACHE_TIME_KEY = "sent_leads_cache_time";
const CACHE_EXPIRY = 10 * 60 * 1000;

// ─── Helpers ──────────────────────────────────────────────────────────────────

function formatDate(value: any): string {
    if (!value) return "—";
    const d = new Date(value);
    if (isNaN(d.getTime())) return String(value);
    const pad = (n: number) => String(n).padStart(2, "0");
    return `${pad(d.getDate())}/${pad(d.getMonth() + 1)}/${d.getFullYear()} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
}

function formatMobile(raw: any): string {
    if (!raw) return "—";
    const digits = String(raw).replace(/\D/g, "");
    if (digits.length === 12 && digits.startsWith("91")) {
        const n = digits.slice(2);
        return `+91 ${n.slice(0, 5)} ${n.slice(5)}`;
    }
    if (digits.length === 10) return `+91 ${digits.slice(0, 5)} ${digits.slice(5)}`;
    return String(raw);
}

function parseNotes(raw: string): string {
    if (!raw) return "—";
    try {
        const obj = JSON.parse(raw);
        const summary =
            obj?.aiExtractionDetails?.summaryOfConvo ||
            obj?.notes ||
            null;
        if (summary) {
            const priority = obj?.aiExtractionDetails?.prority;
            const interact = obj?.aiExtractionDetails?.preffered_way_to_interact;
            const extras = [
                priority && `Priority: ${priority}`,
                interact && `Preferred: ${interact}`,
            ].filter(Boolean).join(" · ");
            return extras ? `${summary} [${extras}]` : summary;
        }
        return raw;
    } catch {
        return raw;
    }
}

function parseKserveResponse(raw: string): { display: string; isError: boolean } {
    if (!raw) return { display: "—", isError: false };
    try {
        let str = raw.trim();
        if (str.startsWith('"') && str.endsWith('"')) {
            str = JSON.parse(str);
        }
        const obj = JSON.parse(str);
        const code = obj?.status_code ?? obj?.statusCode;
        const message = obj?.message || "";
        const isError = code !== undefined ? Number(code) >= 400 : false;
        return {
            display: code !== undefined
                ? `${code}${message ? " — " + message : ""}`.trim()
                : raw,
            isError,
        };
    } catch {
        const isError = /error|fail/i.test(raw) || /^[45]\d\d/.test(raw.trim());
        return { display: raw, isError };
    }
}

function mapDataSource(value: string): { label: string; color: string } {
    const v = (value || "").toLowerCase();
    if (v.includes("facebook") || v.includes("fb")) return { label: value, color: "purple" };
    if (v.includes("whatsapp") || v.includes("wa")) return { label: value, color: "teal" };
    if (v.includes("google")) return { label: value, color: "orange" };
    if (v.includes("ivr")) return { label: value, color: "blue" };
    if (v.includes("ai")) return { label: value, color: "indigo" };
    return { label: value || "Unknown", color: "gray" };
}

function mapStatus(raw: string): { label: string; dot: string; color: string } {
    const s = (raw || "").toLowerCase().trim();
    if (s === "success") return { label: "Success", dot: "g", color: "green" };
    if (s === "failed" || s === "fail") return { label: "Failed", dot: "r", color: "red" };
    if (s === "pending") return { label: "Pending", dot: "o", color: "yellow" };
    if (s === "in progress") return { label: "In Progress", dot: "o", color: "yellow" };
    if (s === "no input") return { label: "No Input", dot: "x", color: "gray" };
    if (s) return { label: raw, dot: "o", color: "yellow" };
    return { label: "Pending", dot: "o", color: "yellow" };
}

// ─── Hook ─────────────────────────────────────────────────────────────────────

export function useSentLeads() {
    const [data, setData] = useState<SentLead[]>(() => {
        if (typeof window !== "undefined") {
            const cached = localStorage.getItem(CACHE_KEY);
            if (cached) {
                try {
                    const parsed = JSON.parse(cached);
                    if (Array.isArray(parsed)) return parsed;
                } catch (e) {
                    console.warn("Failed to parse sent leads cache", e);
                }
            }
        }
        return [];
    });

    const [loading, setLoading] = useState(data.length === 0);
    const [isRefreshing, setIsRefreshing] = useState(false);

    const fetchData = useCallback(async (force = false) => {
        try {
            const cacheTime = localStorage.getItem(CACHE_TIME_KEY);
            const isExpired = !cacheTime || (Date.now() - Number(cacheTime) > CACHE_EXPIRY);

            if (force || isExpired || data.length === 0) {
                if (data.length === 0) setLoading(true);
                else setIsRefreshing(true);

                const res = await fetch("https://script.google.com/macros/s/AKfycbxCbvvL3vEkz29RnkJJVgiPmkWohMJQmGwz0c9hml2GQlEpg4jiLo41KfQ96OPrpfY/exec");
                const json = await res.json();

                const raw: any[] = Array.isArray(json)
                    ? json
                    : Array.isArray(json?.data)
                        ? json.data
                        : Array.isArray(json?.result)
                            ? json.result
                            : [];

                const parseDT = (val: string) => {
                    if (!val || val === "—") return 0;
                    const a = val.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})\s+(\d{1,2}):(\d{2})(?::(\d{2}))?/);
                    if (a) {
                        const first = parseInt(a[1]), second = parseInt(a[2]);
                        const [day, mon] = first > 12 ? [first, second] : [second, first];
                        return new Date(`${a[3]}-${String(mon).padStart(2, "0")}-${String(day).padStart(2, "0")}T${a[4].padStart(2, "0")}:${a[5]}:${a[6] || "00"}`).getTime();
                    }
                    return new Date(val).getTime() || 0;
                };

                const mapped: SentLead[] = raw
                    .filter(r => r && typeof r === "object" && !!r.enqid)
                    .map(r => {
                        const kserve = parseKserveResponse(r.responsefromkserve || "");
                        const genTs = formatDate(r.genratetimestamp);
                        const enqDt = formatDate(r.datetime);
                        return {
                            genTimestamp: genTs,
                            enqDateTime: enqDt,
                            _ts_num: parseDT(genTs),
                            _dt_num: parseDT(enqDt),
                            enquiryId: r.enqid || "—",
                            clientName: r.nameofclient || "N/A",
                            mobile: formatMobile(r.moblie),
                            email: r.emailid || "—",
                            subject: r.subject || "—",
                            notes: parseNotes(r.notes || ""),
                            ivrUrl: r.ivrurl || "—",
                            websiteName: r.websitename || "—",
                            dataSource: mapDataSource(r.datasource || ""),
                            campaignId: r.campaignid || "—",
                            campaignName: r.campaignname || r.datasource || "—",
                            assignTo: r.assignto || "—",
                            kserveResponse: kserve.display,
                            kserveError: kserve.isError,
                            transferTo: r.transfertokservestatus ? formatDate(r.transfertokservestatus) : "—",
                            statusCode: r.stauscode || "—",
                            status: mapStatus(r.stauscode || ""),
                            company: String(r.company ?? "—"),
                            region: String(r.region ?? "—"),
                        };
                    });

                setData(mapped);
                localStorage.setItem(CACHE_KEY, JSON.stringify(mapped));
                localStorage.setItem(CACHE_TIME_KEY, Date.now().toString());
            }
        } catch (err) {
            console.error("Sent API Error:", err);
        } finally {
            setLoading(false);
            setIsRefreshing(false);
        }
    }, [data.length]);

    useEffect(() => { fetchData(); }, [fetchData]);

    return { data, loading, isRefreshing, refetch: () => fetchData(true) };
}
