import { AxiosError } from 'axios';
import { create } from 'zustand';
import { devtools } from 'zustand/middleware';

import { LegalAgreementsResponseProps } from '@/utils/types/legal-agreements.types';

// Types
export interface LegalAgreementsState {
  // Data
  data: LegalAgreementsResponseProps;

  // Loading states
  loading: boolean;

  // Error states
  error: string | null;

  // Actions
  getLegalAgreements: (
    url: string,
    apiGet: (url: string) => Promise<LegalAgreementsResponseProps>
  ) => Promise<void>;
  clearError: () => void;
  reset: () => void;
}

// Initial state
const initialState = {
  data: {} as LegalAgreementsResponseProps,
  loading: false,
  error: null,
};

// Create the store
export const useLegalAgreementsStore = create<LegalAgreementsState>()(
  devtools(
    (set) => ({
      ...initialState,

      // Get legal agreements action
      getLegalAgreements: async (
        url: string,
        apiGet: (url: string) => Promise<LegalAgreementsResponseProps>
      ) => {
        set(
          { loading: true, error: null },
          false,
          'legalAgreements/getLegalAgreements/pending'
        );

        try {
          const data = await apiGet(url);
          set(
            {
              data,
              loading: false,
            },
            false,
            'legalAgreements/getLegalAgreements/fulfilled'
          );
        } catch (error) {
          const err = error as AxiosError<{ message?: string }>;

          set(
            {
              error:
                err?.response?.data?.message || err.message || 'Unknown error',
              loading: false,
            },
            false,
            'legalAgreements/getLegalAgreements/rejected'
          );
        }
      },

      // Utility actions
      clearError: () =>
        set({ error: null }, false, 'legalAgreements/clearError'),
      reset: () => set(initialState, false, 'legalAgreements/reset'),
    }),
    {
      name: 'legal-agreements-store',
    }
  )
);

// Selectors for easy access
export const legalAgreementsSelectors = {
  // Data selectors
  getData: () => useLegalAgreementsStore.getState().data,

  // Loading selectors
  getLoading: () => useLegalAgreementsStore.getState().loading,

  // Error selectors
  getError: () => useLegalAgreementsStore.getState().error,

  // Computed selectors
  haslegalAgreements: () => {
    const data = useLegalAgreementsStore.getState().data;
    return data && Object.keys(data).length > 0;
  },

  hasError: () => {
    const error = useLegalAgreementsStore.getState().error;
    return !!error;
  },

  isLoading: () => useLegalAgreementsStore.getState().loading,
};

export default useLegalAgreementsStore;
