import axios from 'axios';
import { create } from 'zustand';
import { toast } from '@/hooks/use-toast';
import { USER_TOKEN_CL } from '@/utils/data/user-client';
import { BASE_URL } from '@/utils/url';
import { revalidate } from '@/utils/revalidate';

// ── Types ────────────────────────────────────────────────────────────────────

export interface CartItem {
    id: number;
    price: string;
    // Program (group) fields
    group_id?: number;
    group_name?: string;
    group_image?: string;
    // Package fields
    package_id?: number;
    package_name?: string;
    package_image?: string;
    // Display helpers (normalised below)
    display_name?: string;
    display_image?: string;
    item_type?: 'group' | 'package';
}

interface CartStore {
    cart: CartItem[];
    loading: boolean;
    itemIdRemoving: number | string | null;
    itemIdAdding: number | string | null;
    removingAllLoading: boolean;

    // actions
    fetchCart: (t: any) => Promise<void>;
    addToCart: (id: number, t?: any, onSuccess?: () => void, onError?: () => void) => Promise<void>;
    addPackageToCart: (packageId: number, t: any, onSuccess?: () => void, onError?: () => void) => Promise<void>;
    removeFromCart: (id: number, t: any, onSuccess?: () => void, onError?: () => void) => Promise<void>;
    clearCart: (t: any) => Promise<void>;
    applyCoupon: (couponCode: string, t: any) => Promise<void>;
}

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

/** Normalise a raw cart item from GET /cart so both groups and packages render uniformly */
function normaliseItem(raw: any): CartItem {
    const isPackage = raw.package_id != null;
    return {
        ...raw,
        item_type: isPackage ? 'package' : 'group',
        display_name: isPackage ? (raw.package_name ?? raw.group_name) : raw.group_name,
        display_image: isPackage ? (raw.package_image ?? raw.group_image) : raw.group_image,
    } as CartItem;
}

// ── Store ─────────────────────────────────────────────────────────────────────

export const useCart = create<CartStore>((set, get) => ({
    cart: [],
    loading: false,
    itemIdRemoving: null,
    itemIdAdding: null,
    removingAllLoading: false,

    fetchCart: async (t: any) => {
        const token = USER_TOKEN_CL();
        if (!token) {
            set({ cart: [] });
            return;
        }

        set({ loading: true });
        try {
            const response = await axios.get(`${BASE_URL}/cart`, {
                headers: { Authorization: `Bearer ${token}` },
            });

            // Accept ALL items (groups AND packages). Don't filter by price — free items are valid.
            const rawItems: any[] = response.data?.cart?.items ?? [];
            const cartItems = rawItems.map(normaliseItem);
            set({ cart: cartItems, loading: false });
        } catch {
            toast({ variant: 'destructive', title: t?.('custom.failed') ?? 'Error' });
            set({ cart: [], loading: false });
        }
    },

    addToCart: async (id, t, onSuccess, onError) => {
        const token = USER_TOKEN_CL();
        if (!token) {
            set({ cart: [] });
            toast({ variant: 'destructive', title: t('custom.login-first') });
            setTimeout(() => (window.location.pathname = '/login'), 500);
            return;
        }

        try {
            set({ itemIdAdding: id });
            const response = await axios.post(
                `${BASE_URL}/cart/add`,
                { group_id: id, type: 'permanent' },
                { headers: { Authorization: `Bearer ${token}` } }
            );

            if (response.data?.success === false) {
                toast({ variant: 'destructive', title: t('custom.already here') });
                onError?.();
                return;
            }

            await get().fetchCart(t);
            await revalidate({ url: '/cart' });
            await revalidate({ url: '/cart/checkout' });
            toast({ variant: 'success', title: t('custom.done') });
            onSuccess?.();
        } catch (error) {
            const message = axios.isAxiosError(error)
                ? error.response?.data?.message || 'فشل في إضافة البرنامج إلى السلة'
                : 'فشل في إضافة البرنامج إلى السلة';
            toast({ variant: 'destructive', title: t('custom.failed'), description: message });
            onError?.();
        } finally {
            set({ itemIdAdding: null });
        }
    },

    addPackageToCart: async (packageId, t, onSuccess, onError) => {
        const token = USER_TOKEN_CL();
        if (!token) {
            set({ cart: [] });
            toast({ variant: 'destructive', title: t('custom.login-first') });
            setTimeout(() => (window.location.pathname = '/login'), 500);
            return;
        }

        try {
            set({ itemIdAdding: packageId });
            const response = await axios.post(
                `${BASE_URL}/cart/add`,
                { package_id: packageId, type: 'permanent' },
                { headers: { Authorization: `Bearer ${token}` } }
            );

            if (response.data?.success === false) {
                toast({ variant: 'destructive', title: t('custom.already here') });
                onError?.();
                return;
            }

            await get().fetchCart(t);
            await revalidate({ url: '/cart' });
            await revalidate({ url: '/cart/checkout' });
            toast({ variant: 'success', title: t('custom.done') });
            onSuccess?.();
        } catch (error) {
            const message = axios.isAxiosError(error)
                ? error.response?.data?.message || 'فشل في إضافة الباقة إلى السلة'
                : 'فشل في إضافة الباقة إلى السلة';
            toast({ variant: 'destructive', title: t('custom.failed'), description: message });
            onError?.();
        } finally {
            set({ itemIdAdding: null });
        }
    },

    removeFromCart: async (id, t, onSuccess, onError) => {
        const token = USER_TOKEN_CL();
        if (!token) {
            toast({ variant: 'destructive', title: t('custom.failed'), description: t('custom.login-first') });
            return;
        }

        set({ itemIdRemoving: id });
        try {
            await axios.post(
                `${BASE_URL}/cart/remove`,
                { item_id: id },
                { headers: { Authorization: `Bearer ${token}` } }
            );
            await revalidate({ url: '/cart' });
            await revalidate({ url: '/cart/checkout' });
            await get().fetchCart(t);
            toast({ variant: 'success', title: t('custom.done') });
            onSuccess?.();
        } catch (error) {
            const message = axios.isAxiosError(error)
                ? error.response?.data?.message || 'فشل في حذف البرنامج من السلة'
                : 'فشل في حذف البرنامج من السلة';
            toast({ variant: 'destructive', title: t('custom.failed'), description: message });
            onError?.();
        } finally {
            set({ itemIdRemoving: null });
        }
    },

    clearCart: async (t) => {
        const token = USER_TOKEN_CL();
        if (!token) {
            toast({ variant: 'destructive', title: t('custom.failed'), description: t('custom.login-first') });
            return;
        }

        try {
            set({ removingAllLoading: true });
            await axios.post(`${BASE_URL}/cart/remove/all`, {}, { headers: { Authorization: `Bearer ${token}` } });
            await revalidate({ url: '/cart' });
            await revalidate({ url: '/cart/checkout' });
            await get().fetchCart(t);
            toast({ variant: 'success', title: t('custom.done') });
        } catch (error) {
            const message = axios.isAxiosError(error)
                ? error.response?.data?.message || 'فشل في حذف البرنامج من السلة'
                : 'فشل في حذف البرنامج من السلة';
            toast({ variant: 'destructive', title: t('custom.failed'), description: message });
        } finally {
            set({ removingAllLoading: false });
        }
    },

    applyCoupon: async (couponCode: string, t: any) => {
        const token = USER_TOKEN_CL();
        if (!token) {
            toast({ variant: 'destructive', title: 'خطأ', description: 'المستخدم غير مسجل الدخول' });
            return;
        }
        try {
            await axios.post('/api/cart/coupon', { couponCode }, { headers: { Authorization: `Bearer ${token}` } });
            await get().fetchCart(t);
        } catch (error) {
            const message = axios.isAxiosError(error)
                ? error.response?.data?.message || 'فشل في تطبيق الكود'
                : 'فشل في تطبيق الكود';
            toast({ variant: 'destructive', title: 'خطأ', description: message });
        }
    },
}));
