import { IconDefinition } from "@fortawesome/free-solid-svg-icons";
import { VariantProps } from "class-variance-authority";
import { ComponentPropsWithoutRef } from "react";

type FormBuilderButtonElement<ButtonVariants> = {
  label: string;
  type: "submit" | "button" | "reset";
  disabled?: boolean;
  onClick?: MouseEventHandler<HTMLButtonElement>;
  required?: boolean;
  pClassName?: string;
  tooltip?: React.ReactNode
} & VariantProps<ButtonVariants>;

type FormBuilderCheckboxElement<T> = {
  label: string;
  name: keyof T;
  type: "checkbox";
  required?: boolean;
};
q;

type FormBuilderDynamicElement = {
  type: "dynamic";
};

type FormBuilderFileElement<T> = {
  label: string;
  name: keyof T;
  type: "file";
  required?: boolean;
  multiple?: boolean;
};

type FormBuilderGenericElement<T> = {
  label: string;
  name: keyof T;
  type: "text" | "email" | "password";
  icon?: IconDefinition;
  placeholder?: string;
  disabled?: boolean;
  required?: boolean;
};

type FormBuilderGroupElement<T, ButtonVariants> = {
  fields: FormBuilderElement<T, ButtonVariants>[];
  type: "group";
};

type FormBuilderIconElement = {
  label: string;
  type: "icon";
  required?: boolean;
};

type FormBuilderTextareaElement<T> = {
  label: string;
  name: keyof T;
  type: "textarea";
  required?: boolean;
};

type FormBuilderTitleElement = {
  label: string;
  type: "label";
  description: null
  onClick?: MouseEventHandler<HTMLElement>;
};

type FormBuilderBaseElement = {
  className?: string;
  description?: string;
  errors?: Record<string, string>;
};

type FormBuilderElement<T, ButtonVariants> = FormBuilderBaseElement &
  (
    | FormBuilderCheckboxElement<T>
    | FormBuilderDynamicElement
    | FormBuilderFileElement<T>
    | FormBuilderGenericElement<T>
    | FormBuilderGroupElement<T, ButtonVariants>
    | FormBuilderIconElement
    | FormBuilderTextareaElement<T>
    | FormBuilderTitleElement
    | FormBuilderButtonElement<ButtonVariants>
  );
