import { create } from 'zustand';
import { Contact } from '@/types/contacts';
import { Conversation } from '@/types/conversations';
import { SlideImage } from 'yet-another-react-lightbox';

interface ChatState {
  // Selected contact
  selectedContact: Contact | null;
  setSelectedContact: (contact: Contact | null) => void;

  contact: Contact | null;
  setContact: (contact: Contact | null) => void;

  // Conversations/messages
  conversations: Conversation[];
  setConversations: (conversations: Conversation[]) => void;

  // Pagination
  page: number;
  perPage: number;
  setPage: (page: number) => void;
  setPerPage: (perPage: number) => void;

  // Pagination Conversation Contact
  pageConversationContact: number;
  perPageConversationContact: number;
  setPageConversationContact: (pageConversationContact: number) => void;
  setPerPageConversationContact: (perPageConversationContact: number) => void;


  // Pagination Conversation Contact
  pageContact: number;
  perPageContact: number;
  setPageContact: (pageContact: number) => void;
  setPerPageContact: (perPageContact: number) => void;

   
  //Pagination Window Status
  paginationWindow:boolean;
  setPaginationWindow:(status: boolean) => void;


  //Messages
  messageId:string;
  setMessageId:(messageId: string) => void;
  contactId:string;
  setContactId:(contactId: string) => void;


  //Message Reply
  messageReply?:Conversation | null;
  setMessageReply:(messageReply?: Conversation | null) => void;

  selectedBranch:number[],
  setSelectedBranch:(branchs: number[]) => void;

  searchConversationContact:string;
  setSearchConversationContact:(searchConversationContact: string) => void;

  searchContact:string;
  setSearchContact:(searchContact: string) => void;

  selectedLabel:number;
  setSelectedLabel:(selectedLabel: number) => void;

  filterUnreplied:boolean;
  setFilterUnreplied:(filterUnreplied: boolean) => void;

  lightBoxImages:SlideImage[];
  setLightBoxImages:(lightBoxImages: SlideImage[]) => void;

  selectedLightBoxImage:string;
  setSelectedLightBoxImage:(selectedLightBoxImage: string) => void;

  openMessageTemplate:boolean;
  setOpenMessageTemplate:(openMessageTemplate: boolean) => void;

  withoutContact:boolean;
  setWithoutContact:(withoutContact: boolean) => void;

  loadingFirstConversation:boolean;
  setLoadingFirstConversation:(loadingFirstConversation: boolean) => void;

  pageMessageId:number;
  setPageMessageId:(pageMessageId: number) => void;

  pageSelectedMessage:number;
  setPageSelectedMessage:(pageSelectedMessage: number) => void;

  bookmarkModalOpen: boolean;
  setBookmarkModalOpen: (bookmarkModalOpen: boolean) => void;

  // Reset state
  resetChatState: () => void;

  draftMessages: Record<string, string>;
  setDraftMessages: (draftMessages: Record<string, string>) => void;
  setDraftMessage: (contactId: string, message: string) => void;
}

const initialState = {
  selectedContact: null,
  pageMessageId:0,
  pageSelectedMessage:1,
  contact: null,
  paginationWindow:false,
  openMessageTemplate:false,
  bookmarkModalOpen: false,
  withoutContact:false,
  loadingFirstConversation:false,
  messageReply:null,
  searchConversationContact:'',
  searchContact:'',
  selectedLightBoxImage:'',
  selectedLabel:0,
  filterUnreplied:false,
  conversations: [],
  selectedBranch:[],
  lightBoxImages:[],
  messageId:'',
  contactId:'',
  page: 1,
  perPage: 10,
  pageConversationContact: 1,
  perPageConversationContact: 10,
  pageContact:1,
  perPageContact:10,
  draftMessages: {}
};

export const useChatStore = create<ChatState>((set) => ({
  ...initialState,

  setPageSelectedMessage: (pageSelectedMessage) => set({ pageSelectedMessage }),

  setPageMessageId: (pageMessageId) => set({ pageMessageId }),

  setBookmarkModalOpen: (bookmarkModalOpen) => set({ bookmarkModalOpen }),

  setSelectedContact: (selectedContact) => set({ selectedContact }),

  setContact: (contact) => set({ contact }),

  setConversations: (conversations) => set({ conversations }),

  setPage: (page) => set({ page }),

  setPerPage: (perPage) => set({ perPage }),

  setPageContact: (pageContact) => set({ pageContact }),

  setPerPageContact: (perPageContact) => set({ perPageContact }),

  setPageConversationContact: (pageConversationContact) => set({ pageConversationContact }),

  setPerPageConversationContact: (perPageConversationContact) => set({ perPageConversationContact }),

  setPaginationWindow: (paginationWindow) => set({paginationWindow}),

  setMessageId: (messageId) => set({messageId}),

  setContactId: (contactId) => set({contactId}),
  
  setMessageReply: (messageReply) => set({messageReply}),

  setSelectedBranch: (selectedBranch) => set({selectedBranch}),

  setSearchConversationContact: (searchConversationContact) => set({searchConversationContact}),

  setSearchContact: (searchContact) => set({searchContact}),

  setSelectedLabel:(selectedLabel) => set({selectedLabel}),
  
  setFilterUnreplied:(filterUnreplied) => set({filterUnreplied}),

  setLightBoxImages:(lightBoxImages) => set({lightBoxImages}),

  setSelectedLightBoxImage:(selectedLightBoxImage) => set({selectedLightBoxImage}),

  setOpenMessageTemplate:(openMessageTemplate) => set({openMessageTemplate}),

  setWithoutContact:(withoutContact) => set({withoutContact}),

  setLoadingFirstConversation:(loadingFirstConversation) => set({loadingFirstConversation}),

  setDraftMessages: (draftMessages) => set({ draftMessages }),
  setDraftMessage: (contactId, message) => set((state) => ({
    draftMessages: { ...state.draftMessages, [contactId]: message }
  })),

  resetChatState: () => set(initialState),

}));
