import Input from "@/components/Forms/Input";
import InputGroup from "@/components/Forms/InputGroup";
import InputSelectComponent from "@/components/Forms/InputSelect";
import { listarPoliticasComissoes } from "@/requests/CRUD/PoliticasComissoes/listarPoliticasComissoes";
import { listarUsuarios } from "@/requests/CRUD/Usuario/listarUsuarios";
import { GetForm } from "@/utils";
import { useEffect, useState } from "react";
import { FieldValues } from "react-hook-form";
import { useQuery } from "react-query";
import { toast } from "react-toastify";

const FormComissoes = ({
  onSubmitFunction,
  defaultValues,
  disabledFields,
  children,
  columns: comissoes,
  vincularPotencia,
  listdata,
  distribuidores,
  tiposTelhados,
  tiposNegocios,
  ...rest
}: any) => {
  const { handleSubmit, ...form } = GetForm();
  const [hiddenFields, setHiddenFields] = useState<any[]>([]);
  const minRange = "min_valor_politica_comissao";
  const maxRange = "max_valor_politica_comissao";


  function existeMesmoRange(
    lista: any[],
    min: number | string,
    max: number | string,
    tipoNegocio: string,
    ignoreIndex?: number
  ) {
    return lista.some((item, index) => {
      if (ignoreIndex !== undefined && index === ignoreIndex) return false;

      const mesmoRange =
        String(item[minRange]) === String(min) &&
        String(item[maxRange]) === String(max);

      if (!mesmoRange) return false;

      const tipoExistente = String(item.tipo_negocio_politica_comissao);
      const tipoNovo = String(tipoNegocio);


      if (tipoExistente === "*" || (tipoNovo === "*" && tipoExistente)) return true;

      // Conflito normal de mesmo tipo
      return tipoExistente === tipoNovo;
    });
  }
  function onSubmitFormPoliticaPreco(data: FieldValues) {
    const indexEdit = defaultValues?.id_politica_comissao ? listdata.findIndex((a: any) => a.id_politica_comissao === defaultValues.id_politica_comissao) : undefined

    const jaExisteRange = existeMesmoRange(
      listdata,
      data[minRange],
      data[maxRange],
      data.tipo_negocio_politica_comissao,
      indexEdit
    );

    if (jaExisteRange) {
      return toast.error("Já existe uma política com o mesmo range de valores para este tipo de negócio.");
    }
    return onSubmitFunction(data)
  }

  return (
    <form
      onSubmit={handleSubmit(onSubmitFormPoliticaPreco)}
      key={form.key}
      {...rest}
    >
      {comissoes.map(
        (comissao: any, indexPolitica: number) =>
          comissao.columns && (
            <InputGroup key={indexPolitica}>
              <fieldset
                className={`flex flex-col w-full border-${comissao.className?.slice(3).split("/")[0]} border rounded p-2 px-3 ${comissao.className} dark:border-secondary`}
                style={{
                  borderColor: comissao.className?.slice(4).split("]")[0],
                }}
              >
                <legend className="px-3 text-black dark:text-white bg-white rounded dark:bg-black text-center font-bold uppercase">
                  {comissao.header}
                </legend>
                <div className="flex flex-row flex-wrap gap-2 items-stretch">
                  {comissao.columns?.map((column: any, indexField: number) =>
                    column.type ? (
                      <InputSelectComponent
                        key={indexField}
                        name={column.accessorKey}
                        label={
                          column.header
                        }
                        width="min-w-[300px] flex-1"
                        defaultValue={
                          defaultValues && defaultValues[column.accessorKey]
                        }
                        options={
                          column.type == "multiSelect"
                            ? column.options
                              ? [
                                { label: "Todos", value: "*" },
                                ...column.options,
                              ]
                              : []
                            : column.options || []
                        }
                        isMulti={column.type == "multiSelect"}
                        formulario={form}
                      />
                    ) : (
                      !hiddenFields.includes(column.accessorKey) && (
                        <Input
                          key={indexField}
                          name={column.accessorKey}
                          label={column.header}
                          width="flex-1"
                          defaultValue={
                            defaultValues && defaultValues[column.accessorKey]
                          }
                          prefix={["min_valor_politica_comissao", "max_valor_politica_comissao"].includes(column.accessorKey) ? "R$" : ""}
                          mascara={column.mascara as any}
                          formulario={form}

                          inputClassName={`bg-white/${comissao.header == "Variações" && indexField == 0 ? 70 : 50}`}
                        />
                      )
                    )
                  )}
                </div>
              </fieldset>
            </InputGroup>
          )
      )}
      {children}
    </form>
  )
}
export default FormComissoes;