'use client';

import { create } from 'zustand';
import { persist } from 'zustand/middleware';

export interface OnboardingData {
  id: string;
  firstName: string;
  lastName: string;
  phone: string;
  email: string;

  homeAddress: string;
  homeZip: string;
  homeCity: string;
  homeState: string;

  mailingAddress: string;
  mailingZip: string;
  mailingCity: string;
  mailingState: string;

  sameAddress: boolean;
  billing_status_id: number | null;
  dob: string;
  ssn: string;

  authPassed: boolean;
  showMCQ: boolean;

  attemptsLeft: number;
}

interface OnboardingStore {
  /** UI step (1–5) */
  step: number;

  /** Backend truth */
  completed: boolean;

  editInfo: boolean;
  data: OnboardingData;

  /** 🔑 hydrate from login API */
  hydrateFromLogin: (user: any) => void;

  /** Step control (ONLY after backend success) */
  setStep: (step: number) => void;
  finish: () => void;

  agreementHtml: string;
  setAgreementHtml: (html: string) => void;

  agreementId: number | null;
  setAgreementId: (id: number | null) => void;

  updateData: (values: Partial<OnboardingData>) => void;
  setEditInfo: (flag: boolean) => void;

  reset: () => void;
}

export const useOnboardingStore = create<OnboardingStore>()(
  persist(
    (set, get) => ({
      step: 1,
      completed: false,
      editInfo: false,

      data: {
        id: '',
        firstName: '',
        lastName: '',
        phone: '',
        email: '',
        homeAddress: '',
        homeZip: '',
        homeCity: '',
        homeState: '',
        mailingAddress: '',
        mailingZip: '',
        mailingCity: '',
        mailingState: '',
        sameAddress: false,
        dob: '',
        ssn: '',
        billing_status_id: null,
        authPassed: false,
        showMCQ: false,
        attemptsLeft: 2,
      },

      /* 🔑 hydrate store from BACKEND onboarding steps */
      hydrateFromLogin: (user) => {
        const interview = user?.client_interview;
        if (!interview) return;

        const stepEntries = Object.entries(interview).filter(
          ([key, value]) =>
            key.startsWith('step_') && typeof value === 'number'
        );

        const completed =
          stepEntries.length > 0 &&
          stepEntries.every(([, value]) => value === 1);

        const firstIncompleteStep =
          stepEntries.findIndex(([, value]) => value === 0) + 1 || 1;

        set({
          completed,
          step: completed ? stepEntries.length + 1 : firstIncompleteStep,
          data: {
            ...get().data,
            id: user?.client_info?.id ?? '',
            firstName: user?.client_info?.first_name ?? '',
            lastName: user?.client_info?.last_name ?? '',
            email: user?.client_info?.email ?? '',
            phone: user?.client_info?.phone_mobile ?? '',
            dob: user?.client_info?.dob ?? '',
            ssn: user?.client_info?.ssn ?? '',
            billing_status_id: user?.client_info?.billing_status_id ?? null,
          },
        });
      },

      /** ⚠️ Call ONLY after backend step API succeeds */
      setStep: (step) => set({ step }),

      /** ⚠️ Call ONLY after backend confirms final step */
      finish: () => set({ completed: true }),

      agreementHtml: '',
      setAgreementHtml: (html) => set({ agreementHtml: html }),

      agreementId: null,
      setAgreementId: (id) => set({ agreementId: id }),

      updateData: (values) =>
        set((state) => ({
          data: { ...state.data, ...values },
        })),

      setEditInfo: (flag) => set({ editInfo: flag }),

      reset: () =>
        set({
          step: 1,
          completed: false,
          editInfo: false,
          data: {
            id: '',
            firstName: '',
            lastName: '',
            phone: '',
            email: '',
            homeAddress: '',
            homeZip: '',
            homeCity: '',
            homeState: '',
            mailingAddress: '',
            mailingZip: '',
            mailingCity: '',
            mailingState: '',
            sameAddress: false,
            dob: '',
            ssn: '',
            authPassed: false,
            showMCQ: false,
            attemptsLeft: 2,
            billing_status_id: null,
          },
          agreementHtml: '',
          agreementId: null,
        }),
    }),
    { name: 'onboarding-store' }
  )
);
