"use client";
import { useState, useEffect, type ReactNode } from "react";
import {
  useForm,
  type FieldErrors,
  type Resolver,
  type UseFormRegister,
  type UseFormSetValue,
} from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
import { object } from "yup";
import { useValidation } from "@/hooks/useValidation";
import { apiFetch, formatApiMsg } from "@/lib/api";
import FileDropzone from "@/components/shared/FileDropzone";
import {
  fieldBorderClass,
  formatFileSize,
  getFileKey,
  isAllowedUpload,
} from "@/lib/upload/fileUtils";

interface ComplaintDetails {
  id: number | string;
  title: string;
  description: string;
  complain_number: string;
  created_at: string;
  status: string;
  status_translation: string;
  images: string[];
  reply: string | null;
}

interface ComplaintFormData {
  title: string;
  description: string;
  images: File[];
}

interface ComplaintModalProps {
  isOpen: boolean;
  onClose: () => void;
  mode: "create" | "view";
  complaintId?: number | string;
  onSuccess?: () => void;
}

function getComplaintStatusClass(status: string): string {
  if (status === "new") {
    return "text-[#FCD704] bg-[#FCD704]/15";
  }
  if (status === "in_progress") {
    return "text-blue-400 bg-blue-400/15";
  }
  if (status === "resolved") {
    return "text-green-400 bg-green-400/15";
  }
  if (status === "closed") {
    return "text-gray-400 bg-gray-400/15";
  }
  return "text-gray-400 bg-white/5";
}

function hideBrokenImage(event: React.SyntheticEvent<HTMLImageElement>): void {
  event.currentTarget.style.display = "none";
}

function DocumentsUpload({
  files,
  onAddFile,
  onRemoveFile,
}: Readonly<{
  files: File[];
  onAddFile: (f: File) => void;
  onRemoveFile: (index: number) => void;
}>) {
  const handleFile = (file: File) => {
    if (!isAllowedUpload(file)) {
      return;
    }
    onAddFile(file);
  };

  return (
    <div className="border-t border-white/8 pt-4">
      <div className="flex items-center gap-2 mb-3">
        <div className="w-8 h-8 bg-[#FCD704]/15 rounded-lg flex items-center justify-center flex-shrink-0">
          <i className="ri-image-add-line text-[#FCD704]" />
        </div>
        <div className="">
          <p className="text-white text-xs font-bold">المرفقات (اختياري)</p>
          <p className="text-gray-500 text-xs">ارفق صوراً توضح المشكلة</p>
        </div>
      </div>

      <FileDropzone onFile={handleFile}>
        <div className="w-12 h-12 bg-white/5 rounded-lg flex items-center justify-center mb-2">
          <i className="ri-upload-cloud-2-line text-white/40 text-2xl" />
        </div>
        <p className="text-white text-xs font-semibold">ارفق المستندات</p>
        <p className="text-gray-500 text-[11px]">
          اسحب أو اضغط للرفع • PDF, JPG, PNG
        </p>
      </FileDropzone>

      <div className="flex items-center gap-2 mt-2 ">
        <p className="text-gray-500 text-xs">الحجم الأقصى لكل ملف 10 ميجا</p>
        <i className="ri-information-line text-gray-500 text-sm" />
      </div>

      {files.length > 0 && (
        <div className="flex flex-col gap-2 mt-4">
          {files.map((file, idx) => (
            <div
              key={getFileKey(file)}
              className="flex items-center gap-3 p-3 bg-white/3 border border-white/5 rounded-xl "
            >
              <div className="w-9 h-9 bg-[#FCD704]/15 rounded-lg flex items-center justify-center flex-shrink-0">
                <i className="ri-file-check-line text-[#FCD704] text-lg" />
              </div>
              <div className=" flex-1 min-w-0">
                <p className="text-white text-xs font-semibold truncate">
                  {file.name}
                </p>
                <p className="text-gray-500 text-xs">{formatFileSize(file.size)}</p>
              </div>
              <button
                type="button"
                onClick={(e) => {
                  e.stopPropagation();
                  onRemoveFile(idx);
                }}
                className="w-7 h-7 bg-red-500/15 hover:bg-red-500/30 rounded-lg flex items-center justify-center flex-shrink-0 transition-colors cursor-pointer"
              >
                <i className="ri-delete-bin-line text-red-400 text-sm" />
              </button>
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

function ComplaintViewDetails({ details }: Readonly<{ details: ComplaintDetails }>) {
  return (
    <div className="flex flex-col gap-6 ">
      <div className="flex items-center justify-between gap-3 text-sm">
        <span className="text-gray-400">رقم الشكوى: {details.complain_number}</span>
        <div className="flex items-center gap-2">
          <span className="w-1.5 h-1.5 rounded-full bg-white/20" />
          <span className="text-gray-400">
            {new Date(details.created_at).toLocaleDateString("ar-EG", {
              year: "numeric",
              month: "short",
              day: "numeric",
            })}
          </span>
        </div>
      </div>

      <div className="flex">
        <span
          className={`text-xs font-semibold px-2.5 py-1 rounded-full ${getComplaintStatusClass(details.status)}`}
        >
          ● {details.status_translation}
        </span>
      </div>

      <div>
        <h3 className="text-gray-400 text-xs mb-1">عنوان الشكوى</h3>
        <p className="text-white text-sm font-semibold">{details.title}</p>
      </div>
      <div>
        <h3 className="text-gray-400 text-xs mb-1">وصف الشكوى</h3>
        <p className="text-white text-sm leading-relaxed whitespace-pre-wrap">
          {details.description}
        </p>
      </div>

      {details.images && details.images.length > 0 && (
        <div className="border-t border-white/5 pt-4">
          <h3 className="text-gray-400 text-xs mb-3">المرفقات</h3>
          <div className="grid grid-cols-3 gap-3">
            {details.images.map((img) => (
              <div
                key={img}
                className="aspect-square rounded-xl overflow-hidden bg-white/5"
              >
                <img
                  src={img}
                  alt="مرفق"
                  className="w-full h-full object-cover"
                  onError={hideBrokenImage}
                />
              </div>
            ))}
          </div>
        </div>
      )}

      {details.reply && (
        <div className="bg-[#FCD704]/10 border border-[#FCD704]/20 rounded-xl p-4 mt-2">
          <div className="flex items-center gap-2 mb-2 ">
            <h3 className="text-[#FCD704] text-xs font-bold">رد الإدارة</h3>
            <i className="ri-admin-line text-[#FCD704]" />
          </div>
          <p className="text-white text-sm leading-relaxed whitespace-pre-wrap">
            {details.reply}
          </p>
        </div>
      )}
    </div>
  );
}

function renderComplaintViewContent({
  loading,
  error,
  details,
}: {
  loading: boolean;
  error: string;
  details: ComplaintDetails | null;
}): ReactNode {
  if (loading) {
    return (
      <div className="text-center py-10">
        <i className="ri-loader-4-line animate-spin text-[#FCD704] text-3xl" />
      </div>
    );
  }

  if (error) {
    return (
      <div className="bg-red-500/10 border border-red-500/30 rounded-xl p-4 text-center">
        <p className="text-red-400 text-sm">{error}</p>
      </div>
    );
  }

  if (details) {
    return <ComplaintViewDetails details={details} />;
  }

  return null;
}

function ComplaintCreateForm({
  register,
  errors,
  images,
  setValue,
  error,
  onSubmit,
}: Readonly<{
  register: UseFormRegister<ComplaintFormData>;
  errors: FieldErrors<ComplaintFormData>;
  images: File[];
  setValue: UseFormSetValue<ComplaintFormData>;
  error: string;
  onSubmit: () => void;
}>) {
  return (
    <form id="create-complaint-form" onSubmit={onSubmit}>
      <div className="flex flex-col gap-4">
        <div>
          <label
            htmlFor="complaint-title"
            className="text-gray-400 text-xs block mb-2 "
          >
            عنوان الشكوى
          </label>
          <input
            id="complaint-title"
            {...register("title")}
            placeholder="اكتب عنواناً مختصراً"
            className={`w-full bg-[#13151A] border text-white text-sm rounded-xl px-4 py-3.5 outline-none transition-colors  placeholder-gray-600 ${fieldBorderClass(!!errors.title)}`}
            dir="rtl"
          />
          {errors.title && (
            <p className="text-red-400 text-xs mt-1.5 ">{errors.title.message}</p>
          )}
        </div>

        <div>
          <label
            htmlFor="complaint-description"
            className="text-gray-400 text-xs block mb-2 "
          >
            تفاصيل الشكوى
          </label>
          <textarea
            id="complaint-description"
            {...register("description")}
            placeholder="اشرح المشكلة بالتفصيل..."
            rows={5}
            className={`w-full bg-[#13151A] border text-white text-sm rounded-xl px-4 py-3.5 outline-none transition-colors  placeholder-gray-600 resize-none ${fieldBorderClass(!!errors.description)}`}
            dir="rtl"
          />
          {errors.description && (
            <p className="text-red-400 text-xs mt-1.5 ">
              {errors.description.message}
            </p>
          )}
        </div>

        <div>
          <DocumentsUpload
            files={images}
            onAddFile={(file) =>
              setValue("images", [...images, file], { shouldValidate: true })
            }
            onRemoveFile={(idx) =>
              setValue(
                "images",
                images.filter((_, i) => i !== idx),
                { shouldValidate: true },
              )
            }
          />
          {errors.images && (
            <p className="text-red-400 text-xs mt-1.5 ">{errors.images.message}</p>
          )}
        </div>
      </div>

      {error && (
        <div className="bg-red-500/10 border border-red-500/30 rounded-xl p-3 mt-4 text-center">
          <p className="text-red-400 text-sm">{error}</p>
        </div>
      )}
    </form>
  );
}

export default function ComplaintModal({
  isOpen,
  onClose,
  mode,
  complaintId,
  onSuccess,
}: Readonly<ComplaintModalProps>) {
  const [details, setDetails] = useState<ComplaintDetails | null>(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");

  const { validation } = useValidation();
  const schema = object({
    title: validation.title(),
    description: validation.description(),
    images: validation.files_optional(),
  });

  const {
    register,
    handleSubmit,
    setValue,
    watch,
    reset,
    formState: { errors },
  } = useForm<ComplaintFormData>({
    resolver: yupResolver(schema) as Resolver<ComplaintFormData>,
    defaultValues: { title: "", description: "", images: [] },
  });
  const images = watch("images");

  useEffect(() => {
    let active = true;
    if (isOpen && mode === "view" && complaintId) {
      setLoading(true);
      setError("");
      apiFetch<ComplaintDetails>(`/provider/complains/${complaintId}`, {
        method: "GET",
        successCase: (res) => {
          if (active && res.data) setDetails(res.data);
        },
        errorCase: (res) => {
          if (active) setError(formatApiMsg(res.msg) || "خطأ في جلب التفاصيل");
        },
      }).finally(() => {
        if (active) setLoading(false);
      });
    }

    if (isOpen && mode === "create") {
      reset({ title: "", description: "", images: [] });
      setError("");
    }

    return () => {
      active = false;
    };
  }, [isOpen, mode, complaintId, reset]);

  if (!isOpen) {
    return null;
  }

  const onSubmit = async (data: ComplaintFormData) => {
    setError("");
    setLoading(true);

    const fd = new FormData();
    fd.append("title", data.title);
    fd.append("description", data.description);
    data.images.forEach((file) => {
      fd.append("images[]", file);
    });

    await apiFetch("/provider/complains", {
      method: "POST",
      body: fd,
      getSuccess: true,
      successCase: () => {
        onSuccess?.();
        onClose();
      },
      errorCase: (res) => {
        setError(formatApiMsg(res.msg) || "حدث خطأ، يرجى المحاولة مرة أخرى");
      },
    });
    setLoading(false);
  };

  return (
    <div className="fixed inset-0 z-50 flex items-center justify-center p-4">
      <button
        type="button"
        aria-label="إغلاق النافذة"
        className="absolute inset-0 bg-black/60 backdrop-blur-sm cursor-default"
        onClick={onClose}
        onKeyDown={(event) => {
          if (event.key === "Escape") {
            onClose();
          }
        }}
      />
      <dialog
        open
        className="relative bg-[#2A2D36] rounded-2xl w-full max-w-lg overflow-hidden flex flex-col max-h-[90vh] border-0 p-0 m-0"
      >
        <div className="flex items-center justify-between p-6 border-b border-white/5">
          <button
            type="button"
            onClick={onClose}
            className="w-8 h-8 flex items-center justify-center rounded-xl bg-white/5 hover:bg-white/10 text-gray-400 hover:text-white transition-colors cursor-pointer"
          >
            <i className="ri-close-line text-lg" />
          </button>
          <h2 className="text-white font-bold text-lg">
            {mode === "create" ? "إضافة شكوى جديدة" : "تفاصيل الشكوى"}
          </h2>
        </div>

        <div className="p-6 overflow-y-auto">
          {mode === "view" ? (
            renderComplaintViewContent({ loading, error, details })
          ) : (
            <ComplaintCreateForm
              register={register}
              errors={errors}
              images={images}
              setValue={setValue}
              error={error}
              onSubmit={handleSubmit(onSubmit)}
            />
          )}
        </div>

        {mode === "create" && (
          <div className="p-6 border-t border-white/5 bg-[#2A2D36]">
            <button
              type="submit"
              form="create-complaint-form"
              disabled={loading}
              className="w-full bg-[#FCD704] text-[#13151A] font-bold text-base py-3.5 rounded-xl cursor-pointer whitespace-nowrap flex items-center justify-center gap-2 hover:bg-[#FCD704]/90 disabled:opacity-70 transition-opacity"
            >
              {loading ? (
                <>
                  <i className="ri-loader-4-line animate-spin text-lg" />
                  <span>جاري الإرسال...</span>
                </>
              ) : (
                <span>إرسال الشكوى</span>
              )}
            </button>
          </div>
        )}
      </dialog>
    </div>
  );
}
