import { create } from "zustand";
import { persist } from "zustand/middleware";
import { getLang, Lang } from "../locales";
import { Message } from "./chat";
import { ModelConfig, useAppConfig } from "./config";

export const MASK_KEY = "mask-store";

export type Mask = {
  id: number;
  avatar: string;
  name: string;
  context: Message[];
  config: ModelConfig;
  lang: Lang;
};

export const DEFAULT_MASK_STATE = {
  masks: {} as Record<number, Mask>,
  globalMaskId: 0,
};

export type MaskState = typeof DEFAULT_MASK_STATE;
type MaskStore = MaskState & {
  create: (mask: Partial<Mask>) => Mask;
  update: (id: number, updater: (mask: Mask) => void) => void;
  delete: (id: number) => void;
  search: (text: string) => Mask[];
  getAll: () => Mask[];
};

export const useMaskStore = create<MaskStore>()(
  persist(
    (set, get) => ({
      ...DEFAULT_MASK_STATE,

      create(mask) {
        set(() => ({ globalMaskId: get().globalMaskId + 1 }));
        const id = get().globalMaskId;
        const masks = get().masks;
        masks[id] = {
          id,
          avatar: "1f916",
          name: "",
          config: useAppConfig.getState().modelConfig,
          context: [],
          lang: getLang(),
          ...mask,
        };

        set(() => ({ masks }));

        return masks[id];
      },
      update(id, updater) {
        const masks = get().masks;
        const mask = masks[id];
        if (!mask) return;
        const updateMask = { ...mask };
        updater(updateMask);
        masks[id] = updateMask;
        set(() => ({ masks }));
      },
      delete(id) {
        const masks = get().masks;
        delete masks[id];
        set(() => ({ masks }));
      },
      getAll() {
        return Object.values(get().masks).sort((a, b) => a.id - b.id);
      },
      search(text) {
        return Object.values(get().masks);
      },
    }),
    {
      name: MASK_KEY,
      version: 2,
    },
  ),
);