import React, { useState, useEffect } from "react";
import { useFieldArray, useForm } from "react-hook-form";
import { z } from "zod";
import { zodResolver } from "@hookform/resolvers/zod";

import { MasterRespository } from "../../repositories/MastersRepository";
import { clearApiCacheKey } from "../../slices/apiCacheSlice";
import { getCachedData, cacheData } from "../../slices/apiDataManager";
import showToast from "../../services/toastService";

const schema = z.object({
  activityName: z.string().min(1, { message: "Activity Name is required" }),
  unitOfMeasurement: z.string().min(1, { message: "Unit of Measurement is required" }),
  checkList: z
    .array(
      z.object({
        description: z.string().min(1, { message: "descriptionlist item cannot be empty" }),
        isMandatory: z.boolean().default(false),
        id: z.any().default(null),
      })
    )
    .optional(),
});

const CreateActivity = ({ onClose }) => {
  const [isLoading, setIsLoading] = useState(false);

  const {
    register,
    handleSubmit,
    control,
    setValue,
    clearErrors,
    setError,
    getValues,
    reset,
    formState: { errors },
  } = useForm({
    resolver: zodResolver(schema),
    defaultValues: {
      activityName: "",
      unitOfMeasurement: "",
      checkList: [],
    },
  });


  const {
    fields: checkListItems,
    append,
    remove,
  } = useFieldArray({
    control,
    name: "checkList",
  });

  // Form submission handler
  const onSubmit = (data) => {
    setIsLoading(true);

    MasterRespository.createActivity(data)
      .then( ( resp ) =>
      {
        
        const cachedData = getCachedData("Activity");
        const updatedData = [ ...cachedData, resp?.data ];
        cacheData("Activity", updatedData);
        showToast("Activity Successfully Added.", "success");
        setIsLoading(false);
        handleClose()
      })
      .catch((error) => {
        showToast(error.message, "error");
        setIsLoading(false);
      });
  };


  const addChecklistItem = () => {
    const values = getValues("checkList");
    const lastIndex = checkListItems.length - 1;
    if (
      checkListItems.length > 0 &&
      (!values?.[lastIndex] || values[lastIndex].description.trim() === "")
    ) {
      setError(`checkList.${lastIndex}.description`, {
        type: "manual",
        message: "Please fill this checklist item before adding another.",
      });
      return;
    }
    clearErrors(`checkList.${lastIndex}.description`);
    append({
      id: null,
      description: "",
      isMandatory: false,
    });
  };

  const removeChecklistItem = (index) => {
    remove(index);
  };


  const handleChecklistChange = (index, value) => {
    setValue(`checkList.${index}`, value);
  };

  const handleClose = () => {
    reset();
    onClose();
  };



  // for tooltip
  useEffect(() => {
    const tooltipTriggerList = Array.from(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
    tooltipTriggerList.forEach((el) => new bootstrap.Tooltip(el));
  }, []);
  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {/* <h6>Create Activity</h6> */}
      <div className="row">
        <div className="col-6">
          <label className="form-label">Activity</label>
          <input
            type="text"
            {...register("activityName")}
            className={`form-control form-control-sm ${
              errors.activityName ? "is-invalid" : ""
            }`}
          />
          {errors.activityName && (
            <p className="danger-text">{errors.activityName.message}</p>
          )}
        </div>

        <div className="col-6">
          <label className="form-label">Measurement</label>
          <input
            type="text"
            {...register("unitOfMeasurement")}
            className={`form-control form-control-sm ${
              errors.unitOfMeasurement ? "is-invalid" : ""
            }`}
          />
          {errors.unitOfMeasurement && (
            <p className="danger-text">{errors.unitOfMeasurement.message}</p>
          )}
        </div>

        <div className="col-md-12 text-start mt-1">
          <p className="py-1 my-0">{checkListItems.length > 0 ? "Check List" : "Add Check List" }</p>
          {checkListItems.length > 0 && (
          <table className="table mt-1  border-0">
            <thead className="py-0 my-0 table-border-top-0">
              <tr className="py-1">
                <th colSpan={2} className="py-1">
                  <small>Name</small>
                </th>
                <th colSpan={2} className="py-1 text-center">
                  <small>Is Mandatory</small>
                </th>
                <th className="text-center py-1">Action</th>
              </tr>
            </thead>
            <tbody className="table-border-bottom-0 ">
              {checkListItems.map((item, index) => (
                <tr key={index} className="border-top-0">
                  <td colSpan={2} className="border-top-0 border-0">
                    <input
                      className="d-none"
                      {...register(`checkList.${index}.id`)}
                    ></input>
                    <input
                      {...register(`checkList.${index}.description`)}
                      className="form-control form-control-sm"
                      placeholder={`Checklist item ${index + 1}`}
                      onChange={(e) =>
                        handleChecklistChange(index, e.target.value)
                      }
                    />
                    {errors.checkList?.[index]?.description && (
                      <small
                        style={{ fontSize: "10px" }}
                        className="danger-text"
                      >
                        {errors.checkList[index]?.description?.message}
                      </small>
                    )}
                  </td>
                  <td colSpan={2} className="text-center border-0">
                    <input
                      className="form-check-input"
                      type="checkbox"
                      {...register(`checkList.${index}.isMandatory`)}
                      defaultChecked={item.isMandatory}
                    />
                  </td>
                  <td className="text-center border-0">
                    <button
                      type="button"
                      onClick={() => removeChecklistItem(index)}
                      className="btn btn-xs btn-icon btn-text-secondary"
                    >
                      <i className="bx bxs-minus-circle text-danger"  data-bs-toggle="tooltip"
                title="Remove Check"
                data-bs-original-title="Remove check"></i>
                    </button>
                  </td>
                </tr>
              ))}
            </tbody>
          </table>
          )}
          <button
            type="button"
            className="btn btn-xs btn-primary mt-2"
            onClick={addChecklistItem}
          >
            <i className="bx bx-plus-circle" data-bs-toggle="tooltip"
                title="Add Check"
                data-bs-original-title="Add check" ></i>
          </button>
        </div>

        <div className="col-12 text-center mt-3">
          <button type="submit" className="btn btn-sm btn-primary me-3">
            {isLoading ? "Please Wait" : "Submit"}
          </button>
          <button
            type="reset"
            className="btn btn-sm btn-label-secondary"
            onClick={handleClose}
          >
            Cancel
          </button>
        </div>
      </div>
    </form>
  );
};

export default CreateActivity;
