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

export interface ReceivedLead {
    timestamp: string;
    dateTime: string;
    id: string;
    clientName: string;
    mobile: string | number;
    email: string;
    subject: string;
    notes: string;
    ivrUrl: string;
    website: string;
    assignto: string;
    dataSource: string;
    transcription: string;
    viewUrl: string;
    callSubId: string;
    initialid: string;

    callstarttime: string;
    callendtime: string;
    callduration: string;
    callstatus: string;
    calltype: string;
    callendreason: string;

    aicallcategory: string;
    finalcallstatus: string;
    customerengagementlevel: string;
    interestlevel: string;
    calloutcome: string;
    nextactionrequired: string;
    aicallsummary: string;
    leadstatus: string;
    cutomercontext: string;
    preferreddatetime: string;
    cutomerintent: string;
    additionalnotes: string;
    servicecategory: string;
    finalleadoutcome: string;

    scheduledtime: string;
    scheduledstatus: string;
    company: string;

    _parsed?: Record<string, string>;
}

const CACHE_KEY = "received_leads_cache";
const CACHE_TIME_KEY = "received_leads_cache_time";
const CACHE_EXPIRY = 10 * 60 * 1000;

// ─── Notes Parser ─────────────────────────────────────────────────────────────
function parseNotesField(notes: string): Record<string, string> {
    const result: Record<string, string> = {};
    if (!notes || notes === "—") return result;

    try {
        const parsed = JSON.parse(notes);
        if (typeof parsed === "object" && parsed !== null) {
            if (parsed.status) result["callstatus"] = parsed.status;
            if (parsed.call_type) result["calltype"] = parsed.call_type;
            if (parsed.call_start_time) result["callstarttime"] = parsed.call_start_time;
            if (parsed.call_end_time) result["callendtime"] = parsed.call_end_time;
            if (parsed.call_duration) result["callduration"] = String(parsed.call_duration);
            if (parsed.call_summary) result["aicallsummary"] = parsed.call_summary;
            if (parsed.tone) result["customerengagementlevel"] = parsed.tone;
            if (parsed.interest_level) result["interestlevel"] = parsed.interest_level;
            if (parsed.intent) result["cutomerintent"] = parsed.intent;
            if (parsed.call_outcome) result["calloutcome"] = parsed.call_outcome;
            if (parsed.objections) result["additionalnotes"] = parsed.objections;
            if (parsed.pain_points) result["cutomercontext"] = parsed.pain_points;
            if (parsed.preferred_datetime) result["preferreddatetime"] = parsed.preferred_datetime;
            if (parsed.service_category) result["servicecategory"] = parsed.service_category;
            if (parsed.final_lead_outcome) result["finalleadoutcome"] = parsed.final_lead_outcome;
            if (parsed.next_action) result["nextactionrequired"] = parsed.next_action;
            if (parsed.call_category) result["aicallcategory"] = parsed.call_category;
            if (parsed.final_call_status) result["finalcallstatus"] = parsed.final_call_status;
            if (parsed.lead_status) result["leadstatus"] = parsed.lead_status;
            return result;
        }
    } catch { /* not pure JSON */ }

    const afterJson = notes.replace(/notes_by_kairali:\s*\{[\s\S]*?\}\s*,?\s*/, "");
    const patterns: [string, RegExp][] = [
        ["callstatus", /status:\s*([^,]+?)(?=,\s*\w+:|$)/i],
        ["calltype", /call_type:\s*([^,]+?)(?=,\s*\w+:|$)/i],
        ["callstarttime", /call_start_time:\s*(.+?)(?=,\s*call_end_time:)/i],
        ["callendtime", /call_end_time:\s*(.+?)(?=,\s*call_duration:)/i],
        ["callduration", /call_duration:\s*(\d+)/i],
        ["aicallsummary", /call_summary:\s*(.+?)(?=,\s*tone:|$)/i],
        ["customerengagementlevel", /tone:\s*([^,]+?)(?=,\s*\w+:|$)/i],
        ["interestlevel", /interest_level:\s*([^,]+?)(?=,\s*\w+:|$)/i],
        ["cutomerintent", /intent:\s*([^,]+?)(?=,\s*\w+:|$)/i],
        ["calloutcome", /call_outcome:\s*([^,]+?)(?=,\s*\w+:|$)/i],
    ];

    for (const [key, regex] of patterns) {
        const match = afterJson.match(regex);
        if (match) result[key] = match[1].trim();
    }

    try {
        const jsonMatch = notes.match(/notes_by_kairali:\s*(\{[\s\S]*?\})\s*,/);
        if (jsonMatch) {
            const parsed = JSON.parse(jsonMatch[1]);
            if (parsed.aiExtractionDetails?.contact_Time)
                result["preferreddatetime"] = parsed.aiExtractionDetails.contact_Time;
            if (parsed.aiExtractionDetails?.summaryOfConvo)
                result["cutomercontext"] = parsed.aiExtractionDetails.summaryOfConvo;
            if (parsed.aiExtractionDetails?.prority)
                result["leadstatus"] = parsed.aiExtractionDetails.prority;
            if (parsed.notes)
                result["aicallsummary"] = result["aicallsummary"] || parsed.notes;
        }
    } catch { /* ignore */ }

    return result;
}

function merge(colVal: string | number | undefined | null, parsedVal: string | undefined, fallback = "—"): string {
    const col = String(colVal ?? "").trim();
    if (col && col !== "—" && col !== "0") return col;
    return parsedVal?.trim() || fallback;
}

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

export function useReceivedLeads() {
    const [data, setData] = useState<ReceivedLead[]>(() => {
        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 received 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/AKfycbx6TxYo8ts54b3rGlH6Ipq32pKHWlRAcIJZm7Dll8B2bZ4DbMYt286YZ0eXBtpS2cFI/exec");
                const json = await res.json();

                const raw: Record<string, unknown>[] = Array.isArray(json)
                    ? json
                    : json.data || json.result || [];

                const finalData: ReceivedLead[] = raw.map((r: any) => {
                    const notes = String(r?.notes ?? "");
                    const p = parseNotesField(notes);
                    const ts = String(r?.timestamp ?? "");
                    const dt = String(r?.dateTime ?? "");

                    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;
                    };

                    return {
                        timestamp: ts,
                        dateTime: dt,
                        _ts_num: parseDT(ts),
                        _dt_num: parseDT(dt),
                        id: String(r?.id ?? "—"),
                        clientName: String(r?.clientName ?? "—"),
                        mobile: (typeof r?.mobile === "string" || typeof r?.mobile === "number") ? r.mobile : "—",
                        email: String(r?.email ?? "—"),
                        subject: String(r?.subject ?? "—"),
                        notes,
                        ivrUrl: String(r?.ivrUrl ?? "—"),
                        website: String(r?.website ?? "—"),
                        assignto: String(r?.assignto ?? "—"),
                        dataSource: String(r?.dataSource ?? "—"),
                        transcription: String(r?.transcription ?? "—"),
                        viewUrl: String(r?.viewUrl ?? "—"),
                        callSubId: String(r?.callSubId ?? "—"),
                        initialid: String(r?.initialid ?? "—"),

                        callstarttime: merge(r?.callstarttime as string, p["callstarttime"]),
                        callendtime: merge(r?.callendtime as string, p["callendtime"]),
                        callduration: String(r?.callduration) || String(p["callduration"]) || "0",
                        callstatus: merge(r?.callstatus as string, p["callstatus"]),
                        calltype: merge(r?.calltype as string, p["calltype"]),
                        callendreason: merge(r?.callendreason as string, p["callendreason"]),

                        aicallcategory: merge(r?.aicallcategory as string, p["aicallcategory"]),
                        finalcallstatus: merge(r?.finalcallstatus as string, p["finalcallstatus"]),
                        customerengagementlevel: merge(r?.customerengagementlevel as string, p["customerengagementlevel"]),
                        interestlevel: merge(r?.interestlevel as string, p["interestlevel"]),
                        calloutcome: merge(r?.calloutcome as string, p["calloutcome"]),
                        nextactionrequired: merge(r?.nextactionrequired as string, p["nextactionrequired"]),
                        aicallsummary: merge(r?.aicallsummary as string, p["aicallsummary"]),
                        leadstatus: merge(r?.leadstatus as string, p["leadstatus"]),
                        cutomercontext: merge(r?.cutomercontext as string, p["cutomercontext"]),
                        preferreddatetime: merge(r?.preferreddatetime as string, p["preferreddatetime"]),
                        cutomerintent: merge(r?.cutomerintent as string, p["cutomerintent"]),
                        additionalnotes: merge(r?.additionalnotes as string, p["additionalnotes"]),
                        servicecategory: merge(r?.servicecategory as string, p["servicecategory"]),
                        finalleadoutcome: merge(r?.finalleadoutcome as string, p["finalleadoutcome"]),

                        scheduledtime: String(r?.scheduledtime ?? "—"),
                        scheduledstatus: String(r?.scheduledstatus ?? "—"),
                        company: String(r?.company ?? "—"),

                        _parsed: p,
                    };
                });

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

    useEffect(() => { fetchData(); }, []); // Run once on mount

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

