import { createSlice, createAsyncThunk, PayloadAction } from "@reduxjs/toolkit";
import axios from 'axios';
import { toast } from "react-toastify";

type ProfileType = {
    id: number;
    user_id: number;
    name: string;
};

type ProductVariant = {
    id: number;
    name: string;
    regular_price: number;
    special_price: number;
    quantity: number;
    variant_images?: { file_url: string }[];
};


type WishlistType = {
    id: number;
    uuid: string;
    profile_id: number;
    profile: ProfileType | null;
    WishListItem: WishlistItem[];
    created_on: string;
    updated_on: string;
    updated_by?: string;
};

export const fetchWishlistFromBackend = createAsyncThunk<WishlistType>(
    'wishlist/fetchWishlistFromBackend',
    async () => {
        const response = await axios.get('/api/wishlist');
        return response.data as WishlistType;
    }
)

export const addWishlistItemToBackend = createAsyncThunk('wishlist/addWishlistItemToBackend',
    async (variantUUID: string) => {
        const response = await axios.post('/api/wishlist', { variantUUID: variantUUID });

        console.log(response.status)

        if (response.status == 200){
            toast.success("Item has been added to wishlist")
        }
        else if (response.status == 404) {
            toast.error("Item's already in wishlist")
        }

        return response.data
    }
)

export const removeWishlistItemFromBackend = createAsyncThunk('wishlist/removeWishlistItemFromBackend',
    async (uuid: string) => {
        const response = await axios.delete(`/api/wishlist/${uuid}`);
        return response.data
    }
)


const initialState: WishlistType = {
    id: 0,
    uuid: "",
    profile_id: 0,
    profile: null,
    WishListItem: [],
    created_on: "",
    updated_on: "",
    updated_by: ""
};

const wishlistSlice = createSlice({
    name: 'wishlist',
    initialState,
    reducers: {},
    extraReducers: (builder) => {
        builder.addCase(fetchWishlistFromBackend.fulfilled, (state, action: PayloadAction<WishlistType>) => {

            state.id = action.payload.id;
            state.profile_id = action.payload.profile_id;
            state.WishListItem = action.payload.WishListItem
        }),
        builder.addCase(removeWishlistItemFromBackend.fulfilled, (state, action ) => {

            // console.log(action.payload.wishlist)

            // console.log(action.payload.mssg)
            state.WishListItem = action.payload.wishlist.WishListItem
        }),
        builder.addCase(addWishlistItemToBackend.fulfilled, (state, action) => {
            console.log(action.payload)

            state.WishListItem = action.payload.wishlist.WishListItem

            console.log(state.WishListItem)

        }),
        builder.addCase(addWishlistItemToBackend.rejected, (state, action) => {
            if (action.error && action.error.message?.includes("404")) {
                console.error("Item already exists in wishlist");
                toast.error("Item's already in wishlist");
            }

            // toast.error("Failed to add item to wishlist");
        });
    }
});

export default wishlistSlice.reducer;
