import React, { useState } from "react";

// next
import { useRouter } from "next/router";

// react-beautiful-dnd
import { Draggable } from "react-beautiful-dnd";
// component
import StrictModeDroppable from "components/dnd/StrictModeDroppable";
import { SingleCalendarIssue } from "./single-issue";
import { CalendarInlineCreateIssueForm } from "./inline-create-issue-form";
// icons
import { PlusSmallIcon } from "@heroicons/react/24/outline";
// helper
import { formatDate } from "helpers/calendar.helper";
// types
import { ICurrentUserResponse, IIssue } from "types";

type Props = {
  handleIssueAction: (issue: IIssue, action: "copy" | "delete" | "edit") => void;
  index: number;
  date: {
    date: string;
    issues: IIssue[];
  };
  addIssueToDate: (date: string) => void;
  isMonthlyView: boolean;
  showWeekEnds: boolean;
  user: ICurrentUserResponse | undefined;
  isNotAllowed: boolean;
};

export const SingleCalendarDate: React.FC<Props> = (props) => {
  const { handleIssueAction, date, index, isMonthlyView, showWeekEnds, user, isNotAllowed } = props;

  const router = useRouter();
  const { cycleId, moduleId } = router.query;

  const [showAllIssues, setShowAllIssues] = useState(false);
  const [isCreateIssueFormOpen, setIsCreateIssueFormOpen] = useState(false);

  const totalIssues = date.issues.length;

  return (
    <StrictModeDroppable droppableId={date.date}>
      {(provided) => (
        <div
          key={index}
          ref={provided.innerRef}
          {...provided.droppableProps}
          className={`group relative flex min-h-[150px] flex-col gap-1.5 border-t border-custom-border-200 p-2.5 text-left text-sm font-medium hover:bg-custom-background-90 ${
            isMonthlyView ? "" : "pt-9"
          } ${
            showWeekEnds
              ? (index + 1) % 7 === 0
                ? ""
                : "border-r"
              : (index + 1) % 5 === 0
              ? ""
              : "border-r"
          }`}
        >
          {isMonthlyView && <span>{formatDate(new Date(date.date), "d")}</span>}
          {totalIssues > 0 &&
            date.issues.slice(0, showAllIssues ? totalIssues : 4).map((issue: IIssue, index) => (
              <Draggable key={issue.id} draggableId={issue.id} index={index}>
                {(provided, snapshot) => (
                  <SingleCalendarIssue
                    key={index}
                    index={index}
                    provided={provided}
                    snapshot={snapshot}
                    issue={issue}
                    handleEditIssue={() => handleIssueAction(issue, "edit")}
                    handleDeleteIssue={() => handleIssueAction(issue, "delete")}
                    user={user}
                    isNotAllowed={isNotAllowed}
                  />
                )}
              </Draggable>
            ))}

          <CalendarInlineCreateIssueForm
            isOpen={isCreateIssueFormOpen}
            handleClose={() => setIsCreateIssueFormOpen(false)}
            prePopulatedData={{
              target_date: date.date,
              ...(cycleId && { cycle: cycleId.toString() }),
              ...(moduleId && { module: moduleId.toString() }),
            }}
          />

          {totalIssues > 4 && (
            <button
              type="button"
              className="w-min whitespace-nowrap rounded-md border border-custom-border-200 bg-custom-background-80 px-1.5 py-1 text-xs"
              onClick={() => setShowAllIssues((prevData) => !prevData)}
            >
              {showAllIssues ? "Hide" : totalIssues - 4 + " more"}
            </button>
          )}

          <div
            className={`absolute top-2 right-2 flex items-center justify-center rounded-md bg-custom-background-80 p-1 text-xs text-custom-text-200 opacity-0 group-hover:opacity-100`}
          >
            <button
              className="flex items-center justify-center gap-1 text-center"
              onClick={() => setIsCreateIssueFormOpen(true)}
            >
              <PlusSmallIcon className="h-4 w-4 text-custom-text-200" />
              Add issue
            </button>
          </div>

          {provided.placeholder}
        </div>
      )}
    </StrictModeDroppable>
  );
};