// // src/views/components/product/hooks.ts

// import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
// import axios from 'src/configs/axios'
// import endpoints from 'src/configs/endpoints'
// import { Tax } from './types'

// // ============================================================
// //  Error helper
// // ============================================================

// export const getErrorMessage = (err: unknown, fallback: string): string => {
//   const e = err as {
//     response?: {
//       data?: {
//         detail?: string
//         properties?: { description?: string }
//         content?: string
//         message?: string
//         title?: string
//       }
//     }
//     message?: string
//   }
//   const d = e?.response?.data
//   return (
//     d?.detail ||
//     d?.properties?.description ||
//     d?.content ||
//     d?.message ||
//     d?.title ||
//     (err as Error)?.message ||
//     fallback
//   )
// }

// // ============================================================
// //  Helper: get selected tax details
// // ============================================================

// export const getSelectedTaxDetails = (selectedTaxUid: string | undefined, allTaxes: Tax[]): Tax | null => {
//   if (!selectedTaxUid) return null
//   return allTaxes.find(t => t.uid === selectedTaxUid) || null
// }

// // ============================================================
// //  Helper: calculate tax amount
// // ============================================================

// export const calculateTaxAmount = (mrp: string, tax: Tax | null): number => {
//   const mrpValue = parseFloat(mrp) || 0
//   if (!tax) return 0
  
//   if (tax.taxType === 'percentage') {
//     return (mrpValue * tax.taxValue) / 100
//   } else {
//     return tax.taxValue
//   }
// }

// // ============================================================
// //  Helpers: validations
// // ============================================================

// export const validateUnit = (value: string): boolean => {
//   return /^[a-zA-Z]+$/.test(value)
// }

// export const validateAttributeValue = (value: string, isRequired: boolean): boolean => {
//   if (!value && !isRequired) return true
//   if (!value && isRequired) return false
//   return /^[a-zA-Z0-9\s]+$/.test(value)
// }

// export const validateDescription = (value: string): boolean => {
//   if (!value) return true
//   return /^[a-zA-Z0-9\s.,-]*$/.test(value)
// }

// // ============================================================
// //  API functions
// // ============================================================

// export const fetchCategories = async () => {
//   const { data } = await axios.get(endpoints.pos.category.list)
//   return data
// }

// export const fetchVendors = async () => {
//   const { data } = await axios.get(endpoints.pos.vendor.list)
//   return data
// }

// export const fetchTaxes = async () => {
//   const { data } = await axios.get(endpoints.pos.taxes.list)
//   return data
// }

// export const fetchProductByUid = async (uid: string) => {
//   const { data } = await axios.get(`${endpoints.pos.product}${uid}`)
//   return data
// }

// export const createProduct = async (payload: any) => {
//   const formData = new FormData()
  
//   formData.append('name', payload.productName)
//   if (payload.description) formData.append('description', payload.description)
//   formData.append('productType', payload.productType)
//   formData.append('taxChargesType', payload.taxCharges || 'Exclusive')
//   formData.append('isInventoryManaged', String(payload.trackStock || false))
  
//   if (payload.vendorUid) {
//     formData.append('vendorUid.uid', payload.vendorUid)
//   }
  
//   if (payload.taxes) {
//     formData.append('taxUid.uid', payload.taxes)
//   }
  
//   if (payload.categoryUid) {
//     formData.append('categoryUid.uid', payload.categoryUid)
//   }
  
//   if (payload.staffMembers && payload.staffMembers.length > 0) {
//     payload.staffMembers.forEach((staff: any, index: number) => {
//       formData.append(`staffs[${index}].firstName`, staff.firstName || '')
//       formData.append(`staffs[${index}].lastName`, staff.lastName || '')
//       formData.append(`staffs[${index}].emailId`, staff.email || '')
//       formData.append(`staffs[${index}].phoneNumber`, staff.phoneNumber || '')
//       formData.append(`staffs[${index}].countryCode`, staff.dialCodeCountry || 'US')
//       formData.append(`staffs[${index}].dialCountryCode`, staff.countryCode || '+1')
//     })
//   }
  
//   if (payload.variations && payload.variations.length > 0) {
//     payload.variations.forEach((variation: any, index: number) => {
//       formData.append(`variations[${index}].mrp`, String(variation.mrp || 0))
//       if (variation.stockQty !== undefined) {
//         formData.append(`variations[${index}].stockQty`, String(variation.stockQty || 0))
//       }
//       formData.append(`variations[${index}].quantity`, String(variation.noOfItems || 1))
//       formData.append(`variations[${index}].unit`, variation.unit || 'pcs')
//       formData.append(`variations[${index}].calAmount`, String(variation.calculatedAmount || 0))
//       formData.append(`variations[${index}].finalAmount`, String(variation.finalAmount || 0))
      
//       if (variation.attributeValues && variation.attributeValues.length > 0) {
//         variation.attributeValues.forEach((attr: any, attrIndex: number) => {
//           if (attr.value && attr.value.trim()) {
//             formData.append(`variations[${index}].attributes[${attrIndex}].attributeName`, attr.attributeName)
//             formData.append(`variations[${index}].attributes[${attrIndex}].value`, attr.value)
//           }
//         })
//       }
//     })
//   }
  
//   if (payload.specifications && payload.specifications.length > 0) {
//     payload.specifications.forEach((spec: any, index: number) => {
//       formData.append(`specifications[${index}].specKey`, spec.name)
//       formData.append(`specifications[${index}].specValue`, spec.value)
//     })
//   }
  
//   const { data } = await axios.post(endpoints.pos.product, formData, {
//     headers: { 'Content-Type': 'multipart/form-data' }
//   })
//   return data
// }

// export const updateProduct = async (uid: string, payload: any) => {
//   const updatePayload = {
//     name: payload.productName,
//     description: payload.description || '',
//     productType: payload.productType,
//     taxChargesType: payload.taxCharges || 'Exclusive',
//     isInventoryManaged: payload.trackStock || false,
//     categoryUid: { uid: payload.categoryUid },
//     vendorUid: { uid: payload.vendorUid },
//     taxUid: payload.taxes ? { uid: payload.taxes } : undefined,
//     staffs: payload.staffMembers?.map((staff: any) => ({
//       firstName: staff.firstName,
//       lastName: staff.lastName,
//       emailId: staff.email,
//       phoneNumber: staff.phoneNumber,
//       countryCode: staff.dialCodeCountry || 'US',
//       dialCountryCode: staff.countryCode || '+1'
//     })) || []
//   }

//   const { data } = await axios.put(`${endpoints.pos.productbasicdetails}${uid}`, updatePayload)
//   return data
// }

// export const updateProductVariations = async (uid: string, payload: any) => {
//   const formData = new FormData()
//   formData.append('isInventoryManaged', String(payload.trackStock || false))
  
//   if (payload.variations && payload.variations.length > 0) {
//     payload.variations.forEach((variation: any, index: number) => {
//       if (variation.uid) {
//         formData.append(`variations[${index}].uid`, variation.uid)
//       }
//       formData.append(`variations[${index}].mrp`, String(variation.mrp || 0))
//       if (variation.stockQty !== undefined) {
//         formData.append(`variations[${index}].stockQty`, String(variation.stockQty || 0))
//       }
//       formData.append(`variations[${index}].quantity`, String(variation.noOfItems || 1))
//       formData.append(`variations[${index}].unit`, variation.unit || 'pcs')
//       formData.append(`variations[${index}].calAmount`, String(variation.calculatedAmount || 0))
//       formData.append(`variations[${index}].finalAmount`, String(variation.finalAmount || 0))
      
//       if (variation.attributeValues && variation.attributeValues.length > 0) {
//         variation.attributeValues.forEach((attr: any, attrIndex: number) => {
//           if (attr.value && attr.value.trim()) {
//             formData.append(`variations[${index}].attributes[${attrIndex}].attributeName`, attr.attributeName)
//             formData.append(`variations[${index}].attributes[${attrIndex}].value`, attr.value)
//           }
//         })
//       }
//     })
//   }
  
//   const { data } = await axios.put(`${endpoints.pos.productVariations}${uid}`, formData, {
//     headers: { 'Content-Type': 'multipart/form-data' }
//   })
//   return data
// }

// export const updateProductSpecifications = async (uid: string, specifications: any[]) => {
//   const { data } = await axios.put(`${endpoints.pos.productSpecifications}${uid}`, specifications)
//   return data
// }

// export const createCategory = async (payload: any) => {
//   const formData = new FormData()
//   formData.append('name', payload.name)
//   if (payload.description) formData.append('description', payload.description)
//   if (payload.parentUid?.uid) formData.append('parentUid.uid', payload.parentUid.uid)

//   payload.attributeKeys.forEach((attr: any, index: number) => {
//     formData.append(`attributeKeys[${index}].attributeName`, attr.attributeName)
//     formData.append(`attributeKeys[${index}].isRequired`, String(attr.isRequired))
//   })

//   const { data } = await axios.post(endpoints.pos.category.create, formData, {
//     headers: { 'Content-Type': 'multipart/form-data' }
//   })
//   return data
// }

// export const createVendor = async (payload: any) => {
//   const { data } = await axios.post(endpoints.pos.vendor.create, payload)
//   return data
// }

// export const createTax = async (payload: any) => {
//   const { data } = await axios.post(endpoints.pos.taxes.create, payload)
//   return data
// }


// src/views/components/product/hooks.ts

// src/views/components/product/hooks.ts

// import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
// import axios from 'src/configs/axios'
// import endpoints from 'src/configs/endpoints'
// import { Tax } from './types'

// // ============================================================
// //  Error helper
// // ============================================================

// export const getErrorMessage = (err: unknown, fallback: string): string => {
//   const e = err as {
//     response?: {
//       data?: {
//         detail?: string
//         properties?: { description?: string }
//         content?: string
//         message?: string
//         title?: string
//       }
//     }
//     message?: string
//   }
//   const d = e?.response?.data
//   return (
//     d?.detail ||
//     d?.properties?.description ||
//     d?.content ||
//     d?.message ||
//     d?.title ||
//     (err as Error)?.message ||
//     fallback
//   )
// }

// // ============================================================
// //  Helper: get selected tax details
// // ============================================================

// export const getSelectedTaxDetails = (selectedTaxUid: string | undefined, allTaxes: Tax[]): Tax | null => {
//   if (!selectedTaxUid) return null
//   return allTaxes.find(t => t.uid === selectedTaxUid) || null
// }

// // ============================================================
// //  Helper: calculate tax amount
// // ============================================================

// export const calculateTaxAmount = (mrp: string, tax: Tax | null): number => {
//   const mrpValue = parseFloat(mrp) || 0
//   if (!tax) return 0
  
//   if (tax.taxType === 'percentage') {
//     return (mrpValue * tax.taxValue) / 100
//   } else {
//     return tax.taxValue
//   }
// }

// // ============================================================
// //  Helpers: validations
// // ============================================================

// export const validateUnit = (value: string): boolean => {
//   return /^[a-zA-Z]+$/.test(value)
// }

// export const validateAttributeValue = (value: string, isRequired: boolean): boolean => {
//   if (!value && !isRequired) return true
//   if (!value && isRequired) return false
//   return /^[a-zA-Z0-9\s]+$/.test(value)
// }

// export const validateDescription = (value: string): boolean => {
//   if (!value) return true
//   return /^[a-zA-Z0-9\s.,-]*$/.test(value)
// }

// // ============================================================
// //  Helper: Get full image URL
// // ============================================================

// export const getFullImageUrl = (path: string): string => {
//   if (!path) return ''
//   if (path.startsWith('http://') || path.startsWith('https://')) return path
//   if (path.startsWith('blob:')) return path
//   if (path.startsWith('data:')) return path
  
//   // Get base URL from environment or use default
//   const baseUrl = 'http://192.168.1.10:8001'
  
//   // Ensure path starts with /
//   const cleanPath = path.startsWith('/') ? path : `/${path}`
  
//   // Return full URL
//   return `${baseUrl}${cleanPath}`
// }

// // ============================================================
// //  API functions
// // ============================================================

// export const fetchCategories = async () => {
//   const { data } = await axios.get(endpoints.pos.category.list)
//   return data
// }

// export const fetchVendors = async () => {
//   const { data } = await axios.get(endpoints.pos.vendor.list)
//   return data
// }

// export const fetchTaxes = async () => {
//   const { data } = await axios.get(endpoints.pos.taxes.list)
//   return data
// }

// export const fetchProductByUid = async (uid: string) => {
//   const { data } = await axios.get(`${endpoints.pos.product}${uid}`)
//   return data
// }

// export const createProduct = async (payload: any) => {
//   const formData = new FormData()
  
//   formData.append('name', payload.productName)
//   if (payload.description) formData.append('description', payload.description)
//   formData.append('productType', payload.productType)
//   formData.append('taxChargesType', payload.taxCharges || 'Exclusive')
//   formData.append('isInventoryManaged', String(payload.trackStock || false))
  
//   if (payload.vendorUid) {
//     formData.append('vendorUid.uid', payload.vendorUid)
//   }
  
//   if (payload.taxes) {
//     formData.append('taxUid.uid', payload.taxes)
//   }
  
//   if (payload.categoryUid) {
//     formData.append('categoryUid.uid', payload.categoryUid)
//   }
  
//   // Only send staff for ServiceBased products
//   if (payload.productType === 'ServiceBased' && payload.staffMembers && payload.staffMembers.length > 0) {
//     payload.staffMembers.forEach((staff: any, index: number) => {
//       if (staff.firstName || staff.lastName || staff.email || staff.phoneNumber) {
//         formData.append(`staffs[${index}].firstName`, staff.firstName || '')
//         formData.append(`staffs[${index}].lastName`, staff.lastName || '')
//         formData.append(`staffs[${index}].emailId`, staff.email || '')
//         formData.append(`staffs[${index}].phoneNumber`, staff.phoneNumber || '')
//         formData.append(`staffs[${index}].countryCode`, staff.dialCodeCountry || 'US')
//         formData.append(`staffs[${index}].dialCountryCode`, staff.countryCode || '+1')
//       }
//     })
//   }
  
//   if (payload.variations && payload.variations.length > 0) {
//     payload.variations.forEach((variation: any, index: number) => {
//       formData.append(`variations[${index}].mrp`, String(variation.mrp || 0))
//       if (variation.stockQty !== undefined) {
//         formData.append(`variations[${index}].stockQty`, String(variation.stockQty || 0))
//       }
//       formData.append(`variations[${index}].quantity`, String(variation.noOfItems || 1))
//       formData.append(`variations[${index}].unit`, variation.unit || 'pcs')
//       formData.append(`variations[${index}].calAmount`, String(variation.calculatedAmount || 0))
//       formData.append(`variations[${index}].finalAmount`, String(variation.finalAmount || 0))
      
//       if (variation.attributeValues && variation.attributeValues.length > 0) {
//         variation.attributeValues.forEach((attr: any, attrIndex: number) => {
//           if (attr.value && attr.value.trim()) {
//             formData.append(`variations[${index}].attributes[${attrIndex}].attributeName`, attr.attributeName)
//             formData.append(`variations[${index}].attributes[${attrIndex}].value`, attr.value)
//           }
//         })
//       }
      
//       // Add image if present
//       if (variation.image && variation.image instanceof File) {
//         formData.append(`variations[${index}].variationImages[0].image`, variation.image)
//       }
//     })
//   }
  
//   if (payload.specifications && payload.specifications.length > 0) {
//     payload.specifications.forEach((spec: any, index: number) => {
//       formData.append(`specifications[${index}].specKey`, spec.name)
//       formData.append(`specifications[${index}].specValue`, spec.value)
//     })
//   }
  
//   const { data } = await axios.post(endpoints.pos.product, formData, {
//     headers: { 'Content-Type': 'multipart/form-data' }
//   })
//   return data
// }

// export const updateProductBasicDetails = async (uid: string, payload: any) => {
//   const updatePayload: any = {
//     name: payload.productName,
//     description: payload.description || '',
//     productType: payload.productType,
//     taxChargesType: payload.taxCharges || 'Exclusive',
//     isInventoryManaged: payload.trackStock || false,
//     categoryUid: { uid: payload.categoryUid },
//     vendorUid: { uid: payload.vendorUid },
//   }

//   if (payload.taxes) {
//     updatePayload.taxUid = { uid: payload.taxes }
//   }

//   // Only send staff for ServiceBased products with uid if present
//   if (payload.productType === 'ServiceBased' && payload.staffMembers) {
//     updatePayload.staffs = payload.staffMembers
//       .filter((staff: any) => staff.firstName || staff.lastName || staff.email || staff.phoneNumber)
//       .map((staff: any) => {
//         const staffData: any = {
//           firstName: staff.firstName || '',
//           lastName: staff.lastName || '',
//           emailId: staff.email || '',
//           phoneNumber: staff.phoneNumber || '',
//           countryCode: staff.dialCodeCountry || 'US',
//           dialCountryCode: staff.countryCode || '+1'
//         }
//         if (staff.uid) {
//           staffData.staffUID = staff.uid
//         }
//         return staffData
//       })
//   }

//   const { data } = await axios.put(`${endpoints.pos.productbasicdetails}${uid}`, updatePayload)
//   return data
// }

// export const updateProductVariations = async (uid: string, payload: any) => {
//   const formData = new FormData()
//   formData.append('isInventoryManaged', String(payload.trackStock || false))
  
//   if (payload.variations && payload.variations.length > 0) {
//     payload.variations.forEach((variation: any, index: number) => {
//       // Always send uid field
//       // If variation has uid, send it, otherwise send empty string
//       if (variation.uid && variation.uid.trim() !== '') {
//         formData.append(`variations[${index}].uid`, variation.uid)
//       } else {
//         // For new variations, send empty uid
//         formData.append(`variations[${index}].uid`, '')
//       }
      
//       formData.append(`variations[${index}].mrp`, String(variation.mrp || 0))
//       if (variation.stockQty !== undefined) {
//         formData.append(`variations[${index}].stockQty`, String(variation.stockQty || 0))
//       }
//       formData.append(`variations[${index}].quantity`, String(variation.noOfItems || 1))
//       formData.append(`variations[${index}].unit`, variation.unit || 'pcs')
//       formData.append(`variations[${index}].calAmount`, String(variation.calculatedAmount || 0))
//       formData.append(`variations[${index}].finalAmount`, String(variation.finalAmount || 0))
      
//       if (variation.attributeValues && variation.attributeValues.length > 0) {
//         variation.attributeValues.forEach((attr: any, attrIndex: number) => {
//           if (attr.value && attr.value.trim()) {
//             formData.append(`variations[${index}].attributes[${attrIndex}].attributeName`, attr.attributeName)
//             formData.append(`variations[${index}].attributes[${attrIndex}].value`, attr.value)
//           }
//         })
//       }
      
//       // Add image if present (only for new images)
//       if (variation.image && variation.image instanceof File) {
//         formData.append(`variations[${index}].variationImages[0].image`, variation.image)
//       }
//     })
//   }
  
//   const { data } = await axios.put(`${endpoints.pos.productVariations}${uid}`, formData, {
//     headers: { 'Content-Type': 'multipart/form-data' }
//   })
//   return data
// }

// export const updateProductSpecifications = async (uid: string, specifications: any[]) => {
//   const { data } = await axios.put(`${endpoints.pos.productSpecifications}${uid}`, specifications)
//   return data
// }

// export const createCategory = async (payload: any) => {
//   const formData = new FormData()
//   formData.append('name', payload.name)
//   if (payload.description) formData.append('description', payload.description)
//   if (payload.parentUid?.uid) formData.append('parentUid.uid', payload.parentUid.uid)

//   payload.attributeKeys.forEach((attr: any, index: number) => {
//     formData.append(`attributeKeys[${index}].attributeName`, attr.attributeName)
//     formData.append(`attributeKeys[${index}].isRequired`, String(attr.isRequired))
//   })

//   const { data } = await axios.post(endpoints.pos.category.create, formData, {
//     headers: { 'Content-Type': 'multipart/form-data' }
//   })
//   return data
// }

// export const createVendor = async (payload: any) => {
//   const { data } = await axios.post(endpoints.pos.vendor.create, payload)
//   return data
// }

// export const createTax = async (payload: any) => {
//   const { data } = await axios.post(endpoints.pos.taxes.create, payload)
//   return data
// }


// changes //////////////
import axios from 'src/configs/axios'
import endpoints from 'src/configs/endpoints'
import { Tax } from './types'

// ============================================================
//  Error helper - Improved to handle validation errors
// ============================================================

export const getErrorMessage = (err: unknown, fallback: string): string => {
  const e = err as {
    response?: {
      data?: {
        code?: number
        message?: string
        content?: string | Record<string, string>
        detail?: string
        properties?: { description?: string }
        title?: string
      }
    }
    message?: string
  }
  
  const data = e?.response?.data
  
  // Handle validation errors with content object
  if (data?.content && typeof data.content === 'object') {
    const errors = data.content as Record<string, string>

    // Get the first error message without the field name prefix
    const firstError = Object.values(errors)[0]
    if (firstError) {
      return firstError
    }

    // If we need to show all errors, join them without field names
    const errorMessages = Object.values(errors).join('; ')
    return errorMessages || data.message || fallback
  }
  
  // Handle string content
  if (data?.content && typeof data.content === 'string') {
    return data.content
  }
  
  // Handle other error formats
  return (
    data?.message ||
    data?.detail ||
    data?.properties?.description ||
    data?.title ||
    (err as Error)?.message ||
    fallback
  )
}

// ============================================================
//  Helper: get selected tax details
// ============================================================

export const getSelectedTaxDetails = (selectedTaxUid: string | undefined, allTaxes: Tax[]): Tax | null => {
  if (!selectedTaxUid) return null
  return allTaxes.find(t => t.uid === selectedTaxUid) || null
}

// ============================================================
//  Helper: calculate tax amount
// ============================================================

export const calculateTaxAmount = (mrp: string, tax: Tax | null): number => {
  const mrpValue = parseFloat(mrp) || 0
  if (!tax) return 0
  
  if (tax.taxType === 'percentage') {
    return (mrpValue * tax.taxValue) / 100
  } else {
    return tax.taxValue
  }
}

// ============================================================
//  Helpers: validations
// ============================================================

export const validateUnit = (value: string): boolean => {
  return /^[a-zA-Z]+$/.test(value)
}

export const validateAttributeValue = (value: string, isRequired: boolean): boolean => {
  if (!value && !isRequired) return true
  if (!value && isRequired) return false
  return /^[a-zA-Z0-9\s]+$/.test(value)
}

export const validateDescription = (value: string): boolean => {
  if (!value) return true

  // Allow letters, numbers, spaces, and special characters .,-
  return /^[a-zA-Z0-9\s.,-]*$/.test(value)
}

// ============================================================
//  Helper: Get full image URL
// ============================================================

export const getFullImageUrl = (path: string): string => {
  if (!path) return ''
  if (path.startsWith('http://') || path.startsWith('https://')) return path
  if (path.startsWith('blob:')) return path
  if (path.startsWith('data:')) return path
  
  // Get base URL from environment or use default
  // const baseUrl = 'http://192.168.1.5:8001'
  
  // Ensure path starts with /
  const cleanPath = path.startsWith('/') ? path : `/${path}`
  
  // Return full URL
  return `${cleanPath}`
}

// ============================================================
//  API functions
// ============================================================

export const fetchCategories = async () => {
  const { data } = await axios.get(endpoints.pos.category.list)
  return data
}

export const fetchVendors = async () => {
  const { data } = await axios.get(endpoints.pos.vendor.list)
  return data
}

export const fetchTaxes = async () => {
  const { data } = await axios.get(endpoints.pos.taxes.list)
  return data
}

export const fetchProductByUid = async (uid: string) => {
  const { data } = await axios.get(`${endpoints.pos.product}${uid}`)
  return data
}

export const createProduct = async (payload: any) => {
  const formData = new FormData()
  
  formData.append('name', payload.productName)
  if (payload.description) formData.append('description', payload.description)
  formData.append('productType', payload.productType)
  formData.append('taxChargesType', payload.taxCharges || 'Exclusive')
  formData.append('isInventoryManaged', String(payload.trackStock || false))
  
  if (payload.vendorUid) {
    formData.append('vendorUid.uid', payload.vendorUid)
  }
  
  if (payload.taxes) {
    formData.append('taxUid.uid', payload.taxes)
  }
  
  if (payload.categoryUid) {
    formData.append('categoryUid.uid', payload.categoryUid)
  }
  
  // Only send staff for ServiceBased products
  if (payload.productType === 'ServiceBased' && payload.staffMembers && payload.staffMembers.length > 0) {
    payload.staffMembers.forEach((staff: any, index: number) => {
      if (staff.firstName || staff.lastName || staff.email || staff.phoneNumber) {
        formData.append(`staffs[${index}].firstName`, staff.firstName || '')
        formData.append(`staffs[${index}].lastName`, staff.lastName || '')
        formData.append(`staffs[${index}].emailId`, staff.email || '')
        formData.append(`staffs[${index}].phoneNumber`, staff.phoneNumber || '')
        formData.append(`staffs[${index}].countryCode`, staff.dialCodeCountry || 'US')
        formData.append(`staffs[${index}].dialCountryCode`, staff.countryCode || '+1')
      }
    })
  }
  
  if (payload.variations && payload.variations.length > 0) {
    payload.variations.forEach((variation: any, index: number) => {
      formData.append(`variations[${index}].mrp`, String(variation.mrp || 0))
      if (variation.stockQty !== undefined) {
        formData.append(`variations[${index}].stockQty`, String(variation.stockQty || 0))
      }
      formData.append(`variations[${index}].quantity`, String(variation.noOfItems || 1))
      formData.append(`variations[${index}].unit`, variation.unit || 'pcs')
      formData.append(`variations[${index}].calAmount`, String(variation.calculatedAmount || 0))
      formData.append(`variations[${index}].finalAmount`, String(variation.finalAmount || 0))
      
      if (variation.attributeValues && variation.attributeValues.length > 0) {
        variation.attributeValues.forEach((attr: any, attrIndex: number) => {
          if (attr.value && attr.value.trim()) {
            formData.append(`variations[${index}].attributes[${attrIndex}].attributeName`, attr.attributeName)
            formData.append(`variations[${index}].attributes[${attrIndex}].value`, attr.value)
          }
        })
      }
      
      // Add image if present
      if (variation.image && variation.image instanceof File) {
        formData.append(`variations[${index}].variationImages[0].image`, variation.image)
      }
    })
  }
  
  if (payload.specifications && payload.specifications.length > 0) {
    payload.specifications.forEach((spec: any, index: number) => {
      formData.append(`specifications[${index}].specKey`, spec.name)
      formData.append(`specifications[${index}].specValue`, spec.value)
    })
  }
  
  const { data } = await axios.post(endpoints.pos.product, formData, {
    headers: { 'Content-Type': 'multipart/form-data' }
  })
  return data
}

export const updateProductBasicDetails = async (uid: string, payload: any) => {
  const updatePayload: any = {
    name: payload.productName,
    description: payload.description || '',
    productType: payload.productType,
    taxChargesType: payload.taxCharges || 'Exclusive',
    isInventoryManaged: payload.trackStock || false,
    categoryUid: { uid: payload.categoryUid },
    vendorUid: { uid: payload.vendorUid },
  }

  if (payload.taxes) {
    updatePayload.taxUid = { uid: payload.taxes }
  }

  // Only send staff for ServiceBased products with uid if present
  if (payload.productType === 'ServiceBased' && payload.staffMembers) {
    updatePayload.staffs = payload.staffMembers
      .filter((staff: any) => staff.firstName || staff.lastName || staff.email || staff.phoneNumber)
      .map((staff: any) => {
        const staffData: any = {
          firstName: staff.firstName || '',
          lastName: staff.lastName || '',
          emailId: staff.email || '',
          phoneNumber: staff.phoneNumber || '',
          countryCode: staff.dialCodeCountry || 'US',
          dialCountryCode: staff.countryCode || '+1'
        }
        if (staff.uid) {
          staffData.staffUID = staff.uid
        }
        return staffData
      })
  }

  const { data } = await axios.put(`${endpoints.pos.productbasicdetails}${uid}`, updatePayload)
  return data
}

export const updateProductVariations = async (uid: string, payload: any) => {
  const formData = new FormData()
  formData.append('isInventoryManaged', String(payload.trackStock || false))
  
  if (payload.variations && payload.variations.length > 0) {
    payload.variations.forEach((variation: any, index: number) => {
      // Always send uid field
      // If variation has uid, send it, otherwise send empty string
      if (variation.uid && variation.uid.trim() !== '') {
        formData.append(`variations[${index}].uid`, variation.uid)
      } else {
        // For new variations, send empty uid
        formData.append(`variations[${index}].uid`, '')
      }
      
      formData.append(`variations[${index}].mrp`, String(variation.mrp || 0))
      if (variation.stockQty !== undefined) {
        formData.append(`variations[${index}].stockQty`, String(variation.stockQty || 0))
      }
      formData.append(`variations[${index}].quantity`, String(variation.noOfItems || 1))
      formData.append(`variations[${index}].unit`, variation.unit || 'pcs')
      formData.append(`variations[${index}].calAmount`, String(variation.calculatedAmount || 0))
      formData.append(`variations[${index}].finalAmount`, String(variation.finalAmount || 0))
      
      if (variation.attributeValues && variation.attributeValues.length > 0) {
        variation.attributeValues.forEach((attr: any, attrIndex: number) => {
          if (attr.value && attr.value.trim()) {
            formData.append(`variations[${index}].attributes[${attrIndex}].attributeName`, attr.attributeName)
            formData.append(`variations[${index}].attributes[${attrIndex}].value`, attr.value)
          }
        })
      }
      
      // Add image if present (only for new images)
      if (variation.image && variation.image instanceof File) {
        formData.append(`variations[${index}].variationImages[0].image`, variation.image)
      }
    })
  }
  
  const { data } = await axios.put(`${endpoints.pos.productVariations}${uid}`, formData, {
    headers: { 'Content-Type': 'multipart/form-data' }
  })
  return data
}

export const updateProductSpecifications = async (uid: string, specifications: any[]) => {
  const { data } = await axios.put(`${endpoints.pos.productSpecifications}${uid}`, specifications)
  return data
}

export const createCategory = async (payload: any) => {
  const formData = new FormData()
  formData.append('name', payload.name)
  if (payload.description) formData.append('description', payload.description)
  if (payload.parentUid?.uid) formData.append('parentUid.uid', payload.parentUid.uid)

  payload.attributeKeys.forEach((attr: any, index: number) => {
    formData.append(`attributeKeys[${index}].attributeName`, attr.attributeName)
    formData.append(`attributeKeys[${index}].isRequired`, String(attr.isRequired))
  })

  const { data } = await axios.post(endpoints.pos.category.create, formData, {
    headers: { 'Content-Type': 'multipart/form-data' }
  })
  return data
}

export const createVendor = async (payload: any) => {
  const { data } = await axios.post(endpoints.pos.vendor.create, payload)
  return data
}

export const createTax = async (payload: any) => {
  const { data } = await axios.post(endpoints.pos.taxes.create, payload)
  return data
}