import { Addresses } from "@/interfaces/types";
import { createSlice } from "@reduxjs/toolkit";
import { destroyCookie, parseCookies, setCookie } from "nookies";

// Define an interface for the authentication state
interface AuthState {
  session: {
    addresses: Addresses[] | [];
    created_at: string | null;
    default_address: Addresses | null;
    email: string | null;
    id: string | null;
    image: string | null;
    is_active: boolean | null;
    is_banned: boolean | null;
    is_suspended: boolean | null;
    is_verified: boolean | null;
    name: string | null;
    phone: string | null;
    phone_code: string | null;
    role: string | null;
    token: string | null;
    settings: {
      language: string | null;
      allow_notifications: boolean | null;
    } | null;
    type: string | null;
    updated_at: string | null;
    user_type: string | null;
  } | null;
  isLoading: boolean;
}
const initialState: AuthState = {
  session: {
    id: null,
    name: null,
    phone_code: null,
    phone: null,
    email: null,
    image: null,
    is_banned: null,
    is_suspended: null,
    is_verified: null,
    is_active: null,
    token: null,
    role: null,
    type: null,
    user_type: null,
    settings: null,
    addresses: [],
    default_address: null,
    created_at: null,
    updated_at: null,
  },
  isLoading: true,
};
const authSlice = createSlice({
  name: "auth",
  initialState,
  reducers: {
    saveCredentials: (state, action) => {
      const session = action.payload;
      state.session = session;
      setCookie(null, "sessionToken", JSON.stringify(session), {
        maxAge: 30 * 24 * 60 * 60,
        path: "/",
      });
      setCookie(null, "token", session.token, {
        maxAge: 30 * 24 * 60 * 60,
        path: "/",
      });
      state.isLoading = false;
    },
    deleteCredentials: (state) => {
      state.session = null;
      destroyCookie(null, "sessionToken", { path: "/" });
      destroyCookie(null, "token", { path: "/" });
      state.isLoading = false;
    },
    updateUser: (state, action) => {
      if (state.session) {
        const session = {
          ...state.session,
          ...action.payload,
        };
        state.session = session;
        setCookie(null, "sessionToken", JSON.stringify(session), {
          maxAge: 30 * 24 * 60 * 60,
          path: "/",
        });
      } else {
        const session = action.payload;
        state.session = session;
        setCookie(null, "sessionToken", JSON.stringify(session), {
          maxAge: 30 * 24 * 60 * 60,
          path: "/",
        });
      }
      state.isLoading = false;
    },
    setIsLoading: (state, action) => {
      state.isLoading = action.payload;
    },
  },
});

export const { saveCredentials, deleteCredentials, updateUser, setIsLoading } =
  authSlice.actions;
export default authSlice.reducer;
