import {create} from 'zustand';
import {addonManager} from '../api/addonManager';
import {AddonManifest, InstalledAddon} from '../api/addonTypes';

interface AddonState {
  addons: InstalledAddon[];
  loading: boolean;
  hydrated: boolean;
  error: string | null;
  // Actions
  load: () => Promise<void>;
  install: (url: string) => Promise<AddonManifest>;
  remove: (addonId: string) => void;
  toggle: (addonId: string, enabled: boolean) => void;
  refresh: () => void;
}

export const useAddonStore = create<AddonState>((set, _get) => ({
  addons: [],
  loading: false,
  hydrated: false,
  error: null,

  load: async () => {
    set({loading: true, error: null});
    try {
      await addonManager.load();
      set({addons: addonManager.getInstalledAddons(), loading: false, hydrated: true});
    } catch (e) {
      set({loading: false, hydrated: true, error: String(e)});
    }
  },

  install: async (url: string) => {
    set({loading: true, error: null});
    try {
      const manifest = await addonManager.installAddon(url);
      set({addons: addonManager.getInstalledAddons(), loading: false});
      return manifest;
    } catch (e) {
      set({loading: false, error: String(e)});
      throw e;
    }
  },

  remove: (addonId: string) => {
    addonManager.removeAddon(addonId);
    set({addons: addonManager.getInstalledAddons()});
  },

  toggle: (addonId: string, enabled: boolean) => {
    addonManager.toggleAddon(addonId, enabled);
    set({addons: addonManager.getInstalledAddons()});
  },

  refresh: () => {
    set({addons: addonManager.getInstalledAddons()});
  },
}));
