import _ from "lodash";
import { DetailedHTMLProps, FormHTMLAttributes } from "react";
import { twMerge } from "tailwind-merge";

/**
 * # Form Element
 * @className twui-form
 */
export default function Form<T extends object = { [key: string]: any }>({
    ...props
}: DetailedHTMLProps<FormHTMLAttributes<HTMLFormElement>, HTMLFormElement> & {
    submitHandler?: (e: React.FormEvent<HTMLFormElement>, data: T) => void;
}) {
    const finalProps = _.omit(props, "submitHandler");

    return (
        <form
            {...finalProps}
            className={twMerge(
                "flex flex-col items-stretch gap-2 w-full bg-transparent",
                "twui-form",
                props.className
            )}
            onSubmit={(e) => {
                e.preventDefault();
                const formEl = e.target as HTMLFormElement;
                const formData = new FormData(formEl);
                const data = Object.fromEntries(formData.entries()) as T;
                props.submitHandler?.(e, data);
                props.onSubmit?.(e);
            }}
        >
            {props.children}
        </form>
    );
}