import { daysApi, dayNotesApi } from '../../api/client' import type { StoreApi } from 'zustand' import type { TripStoreState } from '../tripStore' import type { DayNote } from '../../types' import { getApiErrorMessage } from '../../types' type SetState = StoreApi['setState'] type GetState = StoreApi['getState'] export interface DayNotesSlice { updateDayNotes: (tripId: number | string, dayId: number | string, notes: string) => Promise updateDayTitle: (tripId: number | string, dayId: number | string, title: string) => Promise addDayNote: (tripId: number | string, dayId: number | string, data: Partial) => Promise updateDayNote: (tripId: number | string, dayId: number | string, id: number, data: Partial) => Promise deleteDayNote: (tripId: number | string, dayId: number | string, id: number) => Promise moveDayNote: (tripId: number | string, fromDayId: number | string, toDayId: number | string, noteId: number, sort_order?: number) => Promise } export const createDayNotesSlice = (set: SetState, get: GetState): DayNotesSlice => ({ updateDayNotes: async (tripId, dayId, notes) => { try { await daysApi.update(tripId, dayId, { notes }) set(state => ({ days: state.days.map(d => d.id === parseInt(String(dayId)) ? { ...d, notes } : d) })) } catch (err: unknown) { throw new Error(getApiErrorMessage(err, 'Error updating notes')) } }, updateDayTitle: async (tripId, dayId, title) => { try { await daysApi.update(tripId, dayId, { title }) set(state => ({ days: state.days.map(d => d.id === parseInt(String(dayId)) ? { ...d, title } : d) })) } catch (err: unknown) { throw new Error(getApiErrorMessage(err, 'Error updating day name')) } }, addDayNote: async (tripId, dayId, data) => { const tempId = Date.now() * -1 const tempNote: DayNote = { id: tempId, day_id: dayId as number, ...data, created_at: new Date().toISOString() } as DayNote set(state => ({ dayNotes: { ...state.dayNotes, [String(dayId)]: [...(state.dayNotes[String(dayId)] || []), tempNote], } })) try { const result = await dayNotesApi.create(tripId, dayId, data) set(state => ({ dayNotes: { ...state.dayNotes, [String(dayId)]: (state.dayNotes[String(dayId)] || []).map(n => n.id === tempId ? result.note : n), } })) return result.note } catch (err: unknown) { set(state => ({ dayNotes: { ...state.dayNotes, [String(dayId)]: (state.dayNotes[String(dayId)] || []).filter(n => n.id !== tempId), } })) throw new Error(getApiErrorMessage(err, 'Error adding note')) } }, updateDayNote: async (tripId, dayId, id, data) => { try { const result = await dayNotesApi.update(tripId, dayId, id, data) set(state => ({ dayNotes: { ...state.dayNotes, [String(dayId)]: (state.dayNotes[String(dayId)] || []).map(n => n.id === id ? result.note : n), } })) return result.note } catch (err: unknown) { throw new Error(getApiErrorMessage(err, 'Error updating note')) } }, deleteDayNote: async (tripId, dayId, id) => { const prev = get().dayNotes set(state => ({ dayNotes: { ...state.dayNotes, [String(dayId)]: (state.dayNotes[String(dayId)] || []).filter(n => n.id !== id), } })) try { await dayNotesApi.delete(tripId, dayId, id) } catch (err: unknown) { set({ dayNotes: prev }) throw new Error(getApiErrorMessage(err, 'Error deleting note')) } }, moveDayNote: async (tripId, fromDayId, toDayId, noteId, sort_order = 9999) => { const state = get() const note = (state.dayNotes[String(fromDayId)] || []).find(n => n.id === noteId) if (!note) return set(s => ({ dayNotes: { ...s.dayNotes, [String(fromDayId)]: (s.dayNotes[String(fromDayId)] || []).filter(n => n.id !== noteId), } })) try { await dayNotesApi.delete(tripId, fromDayId, noteId) const result = await dayNotesApi.create(tripId, toDayId, { text: note.text, time: note.time, icon: note.icon, sort_order, }) set(s => ({ dayNotes: { ...s.dayNotes, [String(toDayId)]: [...(s.dayNotes[String(toDayId)] || []), result.note], } })) } catch (err: unknown) { set(s => ({ dayNotes: { ...s.dayNotes, [String(fromDayId)]: [...(s.dayNotes[String(fromDayId)] || []), note], } })) throw new Error(getApiErrorMessage(err, 'Error moving note')) } }, })