// import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'

// //**   Product type
// interface Product {
//   id: string
//   name: string
//   image: string
//   price: number
//   quantity: number
// }

// //**  State type
// interface ProductsState {
//   list: Product[]
//   categories: string[] // ✅ Added categories
//   loading: boolean
//   catLoading: boolean
//   error: string | null
//   searchTerm: string
//   isCustomerSelected: boolean
//   warningCountSelectCutomer: number
// }

// //** Initial state
// const initialState: ProductsState = {
//   list: [],
//   categories: [], // ✅ Initialize categories
//   loading: false,
//   catLoading: false,
//   error: null,
//   searchTerm: '',
//   isCustomerSelected: false,
//   warningCountSelectCutomer: 0
// }

// //** Async thunk to fetch products
// export const fetchProducts = createAsyncThunk<Product[]>('products/fetchProducts', async () => {
//   const res = await fetch('https://dummyjson.com/products')

//   if (!res.ok) {
//     throw new Error('Failed to fetch products')
//   }

//   const data = await res.json()

//   // Map API fields to Product interface
//   return data.products.map((p: any) => ({
//     id: String(p.id),
//     name: p.title,
//     price: p.price,
//     image: p.images[0],
//     quantity: 0
//   }))
// })

// //** Async thunk to fetch categories
// export const fetchCategories = createAsyncThunk<string[]>('products/fetchCategories', async () => {
//   const res = await fetch('https://dummyjson.com/products/categories')

//   if (!res.ok) {
//     throw new Error('Failed to fetch categories')
//   }

//   const data = await res.json()

//   return data // array of strings
// })

// //**  Slice
// const productsSlice = createSlice({
//   name: 'products',
//   initialState,
//   reducers: {
//     setSearchTerm: (state, action: PayloadAction<string>) => {
//       state.searchTerm = action.payload
//     },
//     selectCustomer: (state, action: PayloadAction<boolean>) => {
//       state.isCustomerSelected = action.payload
//     },
//     handleAlertSelectCustomer: (state, action: PayloadAction<number>) => {
//       state.warningCountSelectCutomer = state.warningCountSelectCutomer + action.payload
//     }
//   },
//   extraReducers: builder => {
//     //**  Products
//     builder
//       .addCase(fetchProducts.pending, state => {
//         state.loading = true
//         state.error = null
//       })
//       .addCase(fetchProducts.fulfilled, (state, action: PayloadAction<Product[]>) => {
//         state.list = action.payload
//         state.loading = false
//       })
//       .addCase(fetchProducts.rejected, (state, action) => {
//         state.loading = false
//         state.error = action.error.message || 'Error'
//         console.log(action.error)
//       })

//     //**  Categories
//     builder
//       .addCase(fetchCategories.pending, state => {
//         state.catLoading = true
//         state.error = null
//       })
//       .addCase(fetchCategories.fulfilled, (state, action: PayloadAction<string[]>) => {
//         state.categories = action.payload
//         state.catLoading = false
//       })
//       .addCase(fetchCategories.rejected, (state, action) => {
//         state.catLoading = false
//         state.error = action.error.message || 'Error'
//       })
//   }
// })

// export const { setSearchTerm, selectCustomer, handleAlertSelectCustomer } = productsSlice.actions
// export default productsSlice.reducer


// sagar changes /////////////////////
import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'
import axios from 'src/configs/axios'
import endpoints from 'src/configs/endpoints'

// ** Types
interface VariationImage {
  id: number
  uid: string
  imageUrl: string
}

interface Variation {
  uid: string
  mrp: number
  stockQty: number
  quantity: number
  unit: string
  calAmount: number
  finalAmount: number
  variationImages: VariationImage[]
  attributes: any[]
}

interface Product {
  uid: string
  name: string
  description?: string
  productType: string
  variations: Variation[]
  categoryUid: any
  vendorUid: any
}

interface Customer {
  uid: string
  firstName: string
  lastName: string
  emailId: string
  phoneNumber: string
}

interface ProductsState {
  list: Product[]
  categories: string[]
  loading: boolean
  catLoading: boolean
  error: string | null
  searchTerm: string
  isCustomerSelected: boolean
  selectedCustomer: Customer | null
  warningCountSelectCutomer: number
}

const initialState: ProductsState = {
  list: [],
  categories: [],
  loading: false,
  catLoading: false,
  error: null,
  searchTerm: '',
  isCustomerSelected: false,
  selectedCustomer: null,
  warningCountSelectCutomer: 0
}

// ** Async thunk to fetch products
export const fetchProducts = createAsyncThunk<Product[]>('products/fetchProducts', async () => {
  const response = await axios.get(endpoints.pos.products)
  const data = response.data?.content?.result || []
  return data
})

// ** Async thunk to fetch categories
export const fetchCategories = createAsyncThunk<string[]>('products/fetchCategories', async () => {
  const response = await axios.get(endpoints.pos.category.list)
  const data = response.data?.content?.result || []
  return data.map((cat: any) => cat.name)
})

const productsSlice = createSlice({
  name: 'products',
  initialState,
  reducers: {
    setSearchTerm: (state, action: PayloadAction<string>) => {
      state.searchTerm = action.payload
    },
    selectCustomer: (state, action: PayloadAction<boolean>) => {
      state.isCustomerSelected = action.payload
    },
    setSelectedCustomer: (state, action: PayloadAction<Customer | null>) => {
      state.selectedCustomer = action.payload
    },
    handleAlertSelectCustomer: (state, action: PayloadAction<number>) => {
      state.warningCountSelectCutomer = state.warningCountSelectCutomer + action.payload
    }
  },
  extraReducers: builder => {
    // Products
    builder
      .addCase(fetchProducts.pending, state => {
        state.loading = true
        state.error = null
      })
      .addCase(fetchProducts.fulfilled, (state, action: PayloadAction<Product[]>) => {
        state.list = action.payload
        state.loading = false
      })
      .addCase(fetchProducts.rejected, (state, action) => {
        state.loading = false
        state.error = action.error.message || 'Error fetching products'
      })

    // Categories
    builder
      .addCase(fetchCategories.pending, state => {
        state.catLoading = true
        state.error = null
      })
      .addCase(fetchCategories.fulfilled, (state, action: PayloadAction<string[]>) => {
        state.categories = action.payload
        state.catLoading = false
      })
      .addCase(fetchCategories.rejected, (state, action) => {
        state.catLoading = false
        state.error = action.error.message || 'Error fetching categories'
      })
  }
})

export const { setSearchTerm, selectCustomer, setSelectedCustomer, handleAlertSelectCustomer } = productsSlice.actions
export default productsSlice.reducer