import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import type { RootState } from "@/store/store";

export interface Language {
  id: number;
  name: string;
  sort_order: number;
  status: number;
  is_interest: number;
}

export const fetchLanguages = createAsyncThunk<Language[], { userId?: number }>(
  "language/fetchAll",
  async ({ userId = 0 }, { rejectWithValue }) => {
    try {
      const { default: apiClient } = await import("@/services/api.client");
      const { API_ENDPOINTS } = await import("@/lib/constants/apiEndpoints");
      const { data } = await apiClient.post<{ status: number; result: Language[] }>(
        API_ENDPOINTS.GET_LANGUAGE,
        { user_id: userId },
      );
      return (data.result ?? []).filter((l) => l.status === 1);
    } catch (err) {
      return rejectWithValue((err as Error)?.message ?? "Failed to load languages.");
    }
  },
);

interface LanguageState {
  languages: Language[];
  loaded: boolean;
  isLoading: boolean;
  error: string | null;
}

const initialState: LanguageState = {
  languages: [],
  loaded: false,
  isLoading: false,
  error: null,
};

const languageSlice = createSlice({
  name: "language",
  initialState,
  reducers: {},
  extraReducers: (builder) => {
    builder
      .addCase(fetchLanguages.pending, (state) => { state.isLoading = true; })
      .addCase(fetchLanguages.fulfilled, (state, action) => {
        state.isLoading = false;
        state.loaded = true;
        state.languages = action.payload;
      })
      .addCase(fetchLanguages.rejected, (state, action) => {
        state.isLoading = false;
        state.error = (action.payload as string) ?? "Something went wrong.";
      });
  },
});

export default languageSlice.reducer;
export const selectLanguages        = (s: RootState) => s.language.languages;
export const selectLanguagesLoaded  = (s: RootState) => s.language.loaded;
export const selectLanguagesLoading = (s: RootState) => s.language.isLoading;
