import { create } from 'zustand';
import type { Plan, UserSubscription, Feature } from '@/types/subscription';
import { canUseFeature, getPlanLimits } from '@/lib/subscription/features';

interface SubscriptionState {
  subscription: UserSubscription | null;
  loading: boolean;
  initialized: boolean;
  setSubscription: (sub: UserSubscription | null) => void;
  setLoading: (v: boolean) => void;
  plan: Plan;
  can: (feature: Feature) => boolean;
  limits: ReturnType<typeof getPlanLimits>;
  refetch: () => Promise<void>;
}

export const useSubscriptionStore = create<SubscriptionState>((set, get) => ({
  subscription: null,
  loading: false,
  initialized: false,

  get plan() {
    return get().subscription?.plan ?? 'free';
  },

  can(feature: Feature) {
    return canUseFeature(get().subscription?.plan ?? 'free', feature);
  },

  get limits() {
    return getPlanLimits(get().subscription?.plan ?? 'free');
  },

  setSubscription(sub) {
    set({ subscription: sub, initialized: true });
  },

  setLoading(v) {
    set({ loading: v });
  },

  async refetch() {
    const { createClient } = await import('@/lib/supabase/client');
    const supabase = createClient();
    const { data: { user } } = await supabase.auth.getUser();
    if (!user) return;
    const { data } = await supabase
      .from('user_subscriptions')
      .select('*')
      .eq('user_id', user.id)
      .single();
    set({ subscription: data ?? null, initialized: true });
  },
}));
