import { create } from "zustand";
import { selectTemplateApi, updateProfileApi } from "../services/userApi";
import { User, UpdateProfilePayload } from "../types/user";
import { deleteAccountApi, logoutApi } from "../services/authApi";

interface UserState {
    user: User | null;
    loading: boolean;
    error: string | null;

    loadUserFromStorage: () => void;
    updateProfile: (payload: UpdateProfilePayload) => Promise<boolean>;
    logout: () => Promise<void>;
    deleteAccount: () => Promise<boolean>;
    selectTemplate: (templateId: string) => Promise<boolean>;

}

export const useUserStore = create<UserState>((set, get) => ({
    user: null,
    loading: false,
    error: null,

    // Reads the `user` object saved in localStorage (set at login) into the store
    loadUserFromStorage: () => {
        try {
            const stored = localStorage.getItem("user");
            if (stored) {
                set({ user: JSON.parse(stored) as User });
            }
        } catch (error) {
            console.error("Failed to parse user from localStorage", error);
        }
    },

    // Calls /user/update-profile, then merges the response into store + localStorage
    updateProfile: async (payload: UpdateProfilePayload) => {
        try {
            set({ loading: true, error: null });

            const response = await updateProfileApi(payload);

            const currentUser = get().user;
            const updatedUser: User = {
                ...(currentUser as User),
                ...(response?.data || {}),
                fullname: payload.fullname,
                title: payload.title,
                degree: payload.degree,
                specialisation: payload.specialisation,
                phone: payload.phoneNumber,
                email: payload.email,
            };


            set({ user: updatedUser, loading: false });
            localStorage.setItem("user", JSON.stringify(updatedUser));

            return true;
        } catch (error: any) {
            set({
                loading: false,
                error:
                    error?.response?.data?.msg ||
                    error?.message ||
                    "Failed to update profile",
            });
            
            return false;
        }
        
    },
    logout: async () => {
    try {
        await logoutApi();
    } catch (error) {
        console.log(error);
    }

    localStorage.removeItem("token");
    localStorage.removeItem("user");

    set({
        user: null,
    });

    window.location.href = "/login";
},

deleteAccount: async () => {
    try {
        await deleteAccountApi();

        localStorage.removeItem("token");
        localStorage.removeItem("user");

        set({
            user: null,
        });

        window.location.href = "/login";

        return true;
    } catch (error: any) {
        set({
            error:
                error?.response?.data?.msg ||
                error?.message ||
                "Failed to delete account",
        });

        return false;
    }
},
selectTemplate: async (templateId) => {
    try {
        set({ loading: true, error: null });

        await selectTemplateApi(templateId);

        set({ loading: false });

        return true;
    } catch (error: any) {
        set({
            loading: false,
            error:
                error?.response?.data?.msg ||
                error?.message ||
                "Failed to select template",
        });

        return false;
    }
},
}));