import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
import API from "../../api";

const baseURL = process.env.NEXT_PUBLIC_BASE_URL_RETAILER;

export const getUpcharge = createAsyncThunk(
  "get/getUpcharge",
  async ({ 
    window_height, 
    category_id,
    category_name, 
    room_no, 
    window_no, 
    cat_sec_no, 
    window_height_fraction 
  }: { 
    window_height: string | number,
    category_id: string | number,
    category_name?: string, 
    room_no?: string | number, 
    window_no?: string | number, 
    cat_sec_no?: string | number, 
    window_height_fraction?: string 
  }, thunkAPI) => {
    try {
      // Create FormData for the POST request
      const formData = new FormData();
      formData.append('window_height', window_height.toString());
      formData.append('category_id', category_id.toString());
      
      // Add optional parameters only if provided
      if (category_name) {
        formData.append('category_name', category_name.toString());
      }
      if (room_no !== undefined) {
        formData.append('room_no', room_no.toString());
      }
      if (window_no !== undefined) {
        formData.append('window_no', window_no.toString());
      }
      if (cat_sec_no !== undefined) {
        formData.append('cat_sec_no', cat_sec_no.toString());
      }
      if (window_height_fraction) {
        formData.append('window_height_fraction', window_height_fraction);
      }

      const response: any = await API.post(
        `${baseURL}/quotation/get_up_charge`,
        formData,
        {
          headers: {
            'Content-Type': 'multipart/form-data',
          },
        }
      );
      
      if (response.data === undefined || typeof response.data !== "object") {
        return thunkAPI.rejectWithValue("Invalid data received");
      }
      return response?.data;
    } catch (error: any) {
      const message =
        (error.response && error.response.data && error.response.data?.message) ||
        error.message ||
        error.toString();
      return thunkAPI.rejectWithValue(message);
    }
  }
);

interface getUpchargeState {
  isGetUpchargeSuccess: boolean;
  upchargeData: any | null;
  isGetUpchargeError: string | undefined;
  isGetUpchargeLoading: boolean;
}

const initialState: getUpchargeState = {
  isGetUpchargeSuccess: false,
  upchargeData: null,
  isGetUpchargeError: "",
  isGetUpchargeLoading: false
};

const getUpchargeSlice = createSlice({
  name: "getUpchargeSlice",
  initialState,
  reducers: {
    resetGetUpcharge: (state: getUpchargeState) => {
      state.isGetUpchargeSuccess = false;
      state.upchargeData = null;
      state.isGetUpchargeError = "";
      state.isGetUpchargeLoading = false;
    }
  },
  extraReducers: (builder) => {
    builder
      .addCase(getUpcharge.pending, (state: getUpchargeState) => {
        state.isGetUpchargeLoading = true;
        state.isGetUpchargeError = "";
        state.upchargeData = null;
        state.isGetUpchargeSuccess = false;
      })
      .addCase(
        getUpcharge.fulfilled,
        (state: getUpchargeState, action: ReturnType<typeof getUpcharge.fulfilled>) => {
          state.isGetUpchargeLoading = false;
          state.upchargeData = action?.payload?.upChargeData;
          state.isGetUpchargeSuccess = true;
          state.isGetUpchargeError = "";
        }
      )
      .addCase(getUpcharge.rejected, (state: getUpchargeState, action: any) => {
        state.isGetUpchargeLoading = false;
        state.isGetUpchargeError = action?.payload || "An error occurred";
        state.isGetUpchargeSuccess = false;
        state.upchargeData = null;
      })
  },
});

export const { resetGetUpcharge } = getUpchargeSlice.actions;

export default getUpchargeSlice.reducer; 