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

export interface EpaperItem {
  id: number;
  channel_id: number;
  date: string;
  pdf: string;
  image: string;
  total_view: number;
  status: number;
  created_at: string;
  updated_at: string;
  channel_name: string;
  channel_image: string;
  is_verified: number;
}

interface EpaperState {
  items: EpaperItem[];
  selectedDate: string;
  isLoading: boolean;
  error: string | null;
}

function todayStr() {
  return new Date().toISOString().slice(0, 10);
}

const initialState: EpaperState = {
  items: [],
  selectedDate: todayStr(),
  isLoading: false,
  error: null,
};

export const fetchEpaper = createAsyncThunk(
  "epaper/fetch",
  async (
    { date, userId = 0 }: { date?: string; userId?: number },
    { rejectWithValue },
  ) => {
    try {
      const { default: apiClient } = await import("@/services/api.client");
      const { API_ENDPOINTS } = await import("@/lib/constants/apiEndpoints");
      const { data } = await apiClient.post<{
        result: EpaperItem[];
      }>(API_ENDPOINTS.GET_EPAPER, {
        date: date ?? todayStr(),
        user_id: userId,
      });
      return {
        items: (data.result ?? []).filter((e) => e.status === 1),
        date: date ?? todayStr(),
      };
    } catch (err) {
      return rejectWithValue(
        (err as Error)?.message ?? "Failed to load e-paper.",
      );
    }
  },
);

export const epaperSlice = createSlice({
  name: "epaper",
  initialState,
  reducers: {
    setSelectedDate: (state, action) => {
      state.selectedDate = action.payload;
    },
  },
  extraReducers: (builder) => {
    builder
      .addCase(fetchEpaper.pending, (state) => {
        state.isLoading = true;
        state.error = null;
      })
      .addCase(fetchEpaper.fulfilled, (state, action) => {
        state.isLoading = false;
        state.items = action.payload.items;
        state.selectedDate = action.payload.date;
      })
      .addCase(fetchEpaper.rejected, (state, action) => {
        state.isLoading = false;
        state.error = (action.payload as string) ?? "Something went wrong.";
      });
  },
});

export const { setSelectedDate } = epaperSlice.actions;
export default epaperSlice.reducer;

export const selectEpaperItems   = (s: RootState) => s.epaper.items;
export const selectEpaperDate    = (s: RootState) => s.epaper.selectedDate;
export const selectEpaperLoading = (s: RootState) => s.epaper.isLoading;
