import { createContext, use, useState } from "react";
import { twMerge } from "tailwind-merge";

interface TabsContextType {
  activeTab: string;
  setActiveTab: (id: string) => void;
}

const TabsContext = createContext({} as TabsContextType);
const useTabs = () => use(TabsContext);

type TabsProps = {
  children: React.ReactNode;
  defaultValue: string;
};

const Tabs: React.FC<TabsProps> = ({ children, defaultValue }) => {
  const [activeTab, setActiveTab] = useState(defaultValue);

  return (
    <TabsContext.Provider value={{ activeTab, setActiveTab }}>
      {children}
    </TabsContext.Provider>
  );
};

type TabsListProps = {
  children: React.ReactNode;
  className?: string;
};

const TabsList: React.FC<TabsListProps> = ({ children, className }) => {
  return (
    <div
      className={twMerge("flex justify-center items-center gap-5", className)}
    >
      {children}
    </div>
  );
};

type TabsTriggerProps = {
  value: string;
  children: string;
  className?: string;
  activeClassName?: string;
};

const TabsTrigger: React.FC<TabsTriggerProps> = ({
  children,
  className,
  activeClassName,
  value,
}) => {
  const { activeTab, setActiveTab } = useTabs();
  const isActive = activeTab === value;

  return (
    <button
      type="button"
      className={twMerge(className, isActive && activeClassName)}
      onClick={() => setActiveTab(value)}
    >
      {children}
    </button>
  );
};

type TabsContentProps = {
  value: string;
  children: React.ReactNode;
};

const TabsContent: React.FC<TabsContentProps> = ({ value, children }) => {
  const { activeTab } = useTabs();

  if (activeTab === value) {
    return <>{children}</>;
  }

  return null;
};

export { Tabs, TabsList, TabsTrigger, TabsContent };

Graph