"use client";

import { useMemo } from "react";
import type { ProjectContext, ProjectStatus } from "@/types/workflow";
import {
  emptyLegacyProject,
  projectToLegacyContext,
  useProjectsStore,
} from "./projects-store";
import { selectActiveProjectRecord } from "./project-selectors";

interface ProjectStore {
  project: ProjectContext;
  setProject: (data: Partial<ProjectContext>) => void;
  setStatus: (status: ProjectStatus) => void;
  createProject: (
    data: Omit<ProjectContext, "created" | "status" | "id"> & { status?: ProjectStatus },
  ) => boolean;
}

function useProjectStoreImpl(): ProjectStore;
function useProjectStoreImpl<T>(selector: (state: ProjectStore) => T): T;
function useProjectStoreImpl<T>(selector?: (state: ProjectStore) => T): T | ProjectStore {
  const active = useProjectsStore(selectActiveProjectRecord);
  const activeProjectId = useProjectsStore((s) => s.activeProjectId);
  const updateProject = useProjectsStore((s) => s.updateProject);
  const setActiveProjectStatus = useProjectsStore((s) => s.setActiveProjectStatus);
  const createProjectFn = useProjectsStore((s) => s.createProject);

  const legacyProject = useMemo(
    () => (active ? projectToLegacyContext(active) : emptyLegacyProject),
    [active],
  );

  const store = useMemo((): ProjectStore => {
    return {
      project: legacyProject,
      setProject: (data) => {
        if (activeProjectId) updateProject(activeProjectId, data);
      },
      setStatus: setActiveProjectStatus,
      createProject: (data) =>
        Boolean(
          createProjectFn({
            name: data.name,
            website: data.website,
            industry: data.industry,
            timezone: data.timezone,
            countries: data.countries,
            status: data.status ?? "active",
          }),
        ),
    };
  }, [
    legacyProject,
    activeProjectId,
    updateProject,
    setActiveProjectStatus,
    createProjectFn,
  ]);

  return selector ? selector(store) : store;
}

export const useProjectStore = useProjectStoreImpl;
