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

export interface SocialLink {
  id: number;
  name: string;
  url: string;
  status: number;
}

export const fetchSocialLinks = createAsyncThunk<SocialLink[]>(
  "social/fetchLinks",
  async (_, { rejectWithValue, getState }) => {
    // Guard: only fetch once
    if ((getState() as RootState).social.isLoaded) return [];
    try {
      const { default: apiClient } = await import("@/services/api.client");
      const { API_ENDPOINTS } = await import("@/lib/constants/apiEndpoints");
      const { data } = await apiClient.post<{ result: SocialLink[] }>(
        API_ENDPOINTS.GET_SOCIAL_LINK,
        {},
      );
      return (data.result ?? []).filter((s) => s.status === 1);
    } catch (err) {
      return rejectWithValue((err as Error)?.message ?? "Failed to load social links.");
    }
  },
);

interface SocialState {
  items: SocialLink[];
  isLoaded: boolean;
  isLoading: boolean;
}

const initialState: SocialState = {
  items: [],
  isLoaded: false,
  isLoading: false,
};

const socialSlice = createSlice({
  name: "social",
  initialState,
  reducers: {},
  extraReducers: (builder) => {
    builder
      .addCase(fetchSocialLinks.pending, (state) => { state.isLoading = true; })
      .addCase(fetchSocialLinks.fulfilled, (state, action) => {
        state.isLoading = false;
        state.isLoaded = true;
        if (action.payload.length > 0) state.items = action.payload;
      })
      .addCase(fetchSocialLinks.rejected, (state) => {
        state.isLoading = false;
        state.isLoaded = true; // don't retry on error
      });
  },
});

export default socialSlice.reducer;
export const selectSocialLinks  = (s: RootState) => s.social.items;
export const selectSocialLoaded = (s: RootState) => s.social.isLoaded;
