"use client";

import { createContext, useContext, useEffect, useMemo, useState } from "react";

export type SiteEnvironment = "Production" | "Staging" | "Development";
export type SiteStatus = "Connected" | "Needs attention" | "Disconnected" | "Paused";

export type Site = {
  id: string;
  name: string;
  url: string;
  environment: SiteEnvironment;
  status: SiteStatus;
  licenseActive?: boolean;
  siteId?: string;
  pluginVersion?: string;
  capabilitiesUrl?: string;
  lastSeenAt: string;
  notes?: string;
};

export type Activity = {
  id: string;
  siteName: string;
  action: string;
  outcome: "Success" | "Failed" | "Pending";
  time: string;
};

export type McpConnection = {
  id: string;
  name: string;
  clientType: "ChatGPT" | "Claude" | "Custom";
  permissionProfile: "Read-only" | "Standard" | "Custom";
  requiresApproval: boolean;
  siteScope: string;
  createdAt: string;
};

type Store = {
  hydrated: boolean;
  organizationName: string;
  planName: string;
  siteLimit: number;
  sites: Site[];
  activity: Activity[];
  connections: McpConnection[];
  setOrganizationName: (name: string) => void;
  addSite: (site: Site) => void;
  updateSite: (siteId: string, changes: Partial<Site>, activity?: Omit<Activity, "id" | "time">) => void;
  removeSite: (siteId: string) => void;
  addConnection: (connection: McpConnection) => void;
};

const StoreContext = createContext<Store | null>(null);

function readState(storageKey: string) {
  try {
    const value = window.localStorage.getItem(storageKey);
    return value ? JSON.parse(value) as Partial<Pick<Store, "organizationName" | "sites" | "activity" | "connections">> : null;
  } catch {
    return null;
  }
}

export function DemoStoreProvider({ children, initialOrganizationName, initialSites, workspaceId, planName, siteLimit }: Readonly<{ children: React.ReactNode; initialOrganizationName: string; initialSites: Site[]; workspaceId: string; planName: string; siteLimit: number }>) {
  const storageKey = `aiwc-saas-local-demo-v1:${workspaceId}`;
  const [hydrated, setHydrated] = useState(false);
  const [organizationName, setOrganizationName] = useState(initialOrganizationName);
  const [sites, setSites] = useState<Site[]>(initialSites);
  const [activity, setActivity] = useState<Activity[]>([]);
  const [connections, setConnections] = useState<McpConnection[]>([]);

  useEffect(() => {
    const state = readState(storageKey);
    queueMicrotask(() => {
      if (state) {
        setOrganizationName(state.organizationName || initialOrganizationName);
        setActivity(state.activity || []);
        setConnections(state.connections || []);
      }
      setSites(initialSites);
      setHydrated(true);
    });
  }, [initialOrganizationName, initialSites, storageKey]);

  useEffect(() => {
    if (!hydrated) return;
    window.localStorage.setItem(storageKey, JSON.stringify({ organizationName, activity, connections }));
  }, [activity, connections, hydrated, organizationName, storageKey]);

  const value = useMemo<Store>(() => ({
    hydrated,
    organizationName,
    planName,
    siteLimit,
    sites,
    activity,
    connections,
    setOrganizationName,
    addSite: (site) => {
      setSites((current) => [site, ...current]);
      setActivity((current) => [{ id: crypto.randomUUID(), siteName: site.name, action: "Validated and enrolled site", outcome: "Success", time: "Just now" }, ...current]);
    },
    updateSite: (siteId, changes, activityItem) => {
      const site = sites.find((item) => item.id === siteId);
      if (!site) return;
      setSites((current) => current.map((item) => item.id === siteId ? { ...item, ...changes } : item));
      if (activityItem) setActivity((current) => [{ id: crypto.randomUUID(), time: "Just now", ...activityItem }, ...current]);
    },
    removeSite: (siteId) => {
      const site = sites.find((item) => item.id === siteId);
      if (!site) return;
      setSites((current) => current.filter((item) => item.id !== siteId));
      setConnections((current) => current.map((connection) => connection.siteScope === "All enrolled sites" ? connection : { ...connection, siteScope: "Site removed - review access" }));
      setActivity((current) => [{ id: crypto.randomUUID(), siteName: site.name, action: "Removed local site enrollment", outcome: "Pending", time: "Just now" }, ...current]);
    },
    addConnection: (connection) => {
      setConnections((current) => [connection, ...current]);
      setActivity((current) => [{ id: crypto.randomUUID(), siteName: "Workspace", action: `Created MCP connection: ${connection.name}`, outcome: "Success", time: "Just now" }, ...current]);
    },
  }), [activity, connections, hydrated, organizationName, planName, siteLimit, sites]);

  return <StoreContext.Provider value={value}>{children}</StoreContext.Provider>;
}

export function useDemoStore() {
  const store = useContext(StoreContext);
  if (!store) throw new Error("useDemoStore must be used inside DemoStoreProvider");
  return store;
}
