import { create } from 'zustand'
import type { CommCode } from '@/types/CommCode'
import type { SuitableIds } from '@/types/Suitable'

interface SuitableState {
  /* 초기 데이터 로드 개수*/
  itemPerPage: number

  /* 공통코드 */
  suitableCommCode: Map<string, CommCode[]>
  /* 공통코드 설정 */
  setSuitableCommCode: (headCode: string, commCode: CommCode[]) => void

  /* 검색 상태 */
  isSearch: boolean
  /* 검색 상태 설정 */
  setIsSearch: (isSearch: boolean) => void

  /* 선택된 카테고리 */
  selectedCategory: string
  /* 선택된 카테고리 설정 */
  setSelectedCategory: (category: string) => void

  /* 검색 값 */
  searchValue: string
  /* 검색 값 설정 */
  setSearchValue: (value: string) => void

  /* 선택된 아이템 리스트 */
  selectedItems: Map<number, Set<number>>
  /* 선택 아이템 추가 */
  addSelectedItem: (mainId: number, detailId?: number, detailIds?: Set<number>) => void
  /* 아이템 전체 추가 */
  addAllSelectedItem: (suitableIds: SuitableIds[]) => void
  /* 선택된 아이템 제거 */
  removeSelectedItem: (mainId: number, detailId?: number) => void
  /* 선택된 아이템 모두 제거 */
  clearSelectedItems: () => void
}

export const useSuitableStore = create<SuitableState>((set) => ({
  itemPerPage: 100 as number,
  suitableCommCode: new Map() as Map<string, CommCode[]>,
  isSearch: false as boolean,
  selectedCategory: '' as string,
  searchValue: '' as string,
  selectedItems: new Map() as Map<number, Set<number>>,

  /* 공통코드 설정 */
  setSuitableCommCode: (headCode: string, commCode: CommCode[]) =>
    set((state) => ({
      suitableCommCode: new Map(state.suitableCommCode).set(headCode, commCode),
    })),

  /* 검색 상태 설정 */
  setIsSearch: (isSearch: boolean) => set({ isSearch }),

  /* 선택된 카테고리 설정 */
  setSelectedCategory: (category: string) => set({ selectedCategory: category }),

  /* 검색 값 설정 */
  setSearchValue: (value: string) => set({ searchValue: value }),

  /* 선택된 아이템 추가 */
  addSelectedItem: (mainId: number, detailId?: number, detailIds?: Set<number>) => {
    if (detailId) {
      // 디테일(하위) 아이템 추가
      set((state) => {
        const detailSet = state.selectedItems.get(mainId) || new Set()
        detailSet.add(detailId)
        state.selectedItems.set(mainId, detailSet)
        return { selectedItems: state.selectedItems }
      })
    } else {
      // 메인(상위) 아이템 추가
      set((state) => {
        state.selectedItems.set(mainId, detailIds || new Set())
        return { selectedItems: state.selectedItems }
      })
    }
  },

  /* 아이템 전체 추가 */
  addAllSelectedItem: (suitableIds: SuitableIds[]) => {
    set(() => {
      const newSelectedItems = new Map()
      suitableIds.forEach((suitableId) => {
        newSelectedItems.set(suitableId.id, new Set(suitableId.detailId.split(',').map(Number)))
      })
      return { selectedItems: newSelectedItems }
    })
  },

  /* 선택된 아이템 제거 */
  removeSelectedItem: (mainId: number, detailId?: number) => {
    set((state) => {
      const newSelectedItems = new Map(state.selectedItems)

      if (!detailId) {
        // 메인(상위) 아이템 제거
        newSelectedItems.delete(mainId)
        return { selectedItems: newSelectedItems }
      }

      // 디테일(하위) 아이템 제거
      const detailSet = state.selectedItems.get(mainId) || new Set()
      detailSet.delete(detailId)

      // 디테일(하위)하위 아이템이 모두 제거되면 메인 아이템도 제거
      detailSet.size === 0 ? newSelectedItems.delete(mainId) : newSelectedItems.set(mainId, detailSet)

      return { selectedItems: newSelectedItems }
    })
  },

  /* 선택된 아이템 모두 제거 */
  clearSelectedItems: () => set({ selectedItems: new Map() as Map<number, Set<number>> }),
}))
