import React, { useEffect, useMemo, useRef, useState } from "react";
import { Axiosinstance } from "../services/auth/Axiosinstance";
import { useToast } from "../components/ToastProvider";

import PageHeader from "../components/ui/PageHeader";
import Button from "../components/ui/Button";

import { LuRefreshCcw } from "react-icons/lu";

import useCooldownAction from "../hooks/useCooldownAction";

import { flattenFilesFromFolders } from "../utils/storage";
import { getErrMsg } from "../utils/account";

import SpaceStatusBadge from "../components/space/SpaceStatusBadge";
import SpaceUsageCard from "../components/space/SpaceUsageCard";
import SpaceQuickSummaryCard from "../components/space/SpaceQuickSummaryCard";
import SpaceFilesCard from "../components/space/SpaceFilesCard";
import SpaceFileDetailsCard from "../components/space/SpaceFileDetailsCard";

const DEFAULT_QUOTA_BYTES = 10 * 1024 * 1024 * 1024; // 10GB
const getFileSize = (file) => (file?.current_version?.size != null ? file.current_version.size : file?.size || 0);

const clamp = (n, min, max) => Math.min(max, Math.max(min, n));

export default function Space() {
  const { success, error: toastError, info } = useToast();

  const [usedBytes, setUsedBytes] = useState(0);
  const [quotaBytes, setQuotaBytes] = useState(DEFAULT_QUOTA_BYTES);
  const [remainingBytes, setRemainingBytes] = useState(0);

  // ✅ همون عددی که بک‌اند میده (مثلا 0.06)
  const [usedPercentRaw, setUsedPercentRaw] = useState(null);

  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");

  const [files, setFiles] = useState([]);
  const [sortDesc, setSortDesc] = useState(true);
  const [query, setQuery] = useState("");
  const [selected, setSelected] = useState(null);

  // ✅ حذف دائمی دو مرحله‌ای
  const hardDeleteArmedRef = useRef({ id: null, until: 0 });

  const fetchData = async (showToast = true) => {
    try {
      setLoading(true);
      setError("");

      const [usageRes, itemsRes] = await Promise.all([
        Axiosinstance.get("storage/usage/"),
        Axiosinstance.get("storage/items/"),
      ]);

      const usageData = usageRes.data || {};

      const used = Number(usageData.used_bytes ?? 0);

      // ✅ FIX quota: بک‌اند total_quota_bytes می‌فرسته
      const quota = Number(
        usageData.total_quota_bytes ??
          usageData.quota_bytes ??
          DEFAULT_QUOTA_BYTES
      );

      const remaining = Number(
        usageData.remaining_bytes ?? Math.max(0, quota - used)
      );

      // ✅ مهم: همون مقداری که بک‌اند داده (مثلا 0.06)
      const backendPercent = usageData.used_percent;
      const percentRaw =
        backendPercent === null || backendPercent === undefined || backendPercent === ""
          ? null
          : Number(backendPercent);

      setUsedBytes(isFinite(used) ? used : 0);
      setQuotaBytes(isFinite(quota) && quota > 0 ? quota : DEFAULT_QUOTA_BYTES);
      setRemainingBytes(isFinite(remaining) ? remaining : 0);
      setUsedPercentRaw(isFinite(percentRaw) ? percentRaw : null);

      const itemsData = itemsRes.data || {};

      const rootFiles = (itemsData.files || []).map((file) => ({
        ...file,
        folderPath: "ریشه",
      }));

      const nestedFiles = flattenFilesFromFolders(itemsData.folders || [], "ریشه");
      const allFiles = [...rootFiles, ...nestedFiles].filter((f) => !f.in_trash);

      setFiles(allFiles);

      if (selected) {
        const exists = allFiles.find((f) => f.id === selected.id);
        if (!exists) setSelected(null);
      }

      if (showToast) success("اطلاعات بروزرسانی شد.", { title: "بروزرسانی" });
    } catch (err) {
      console.error("خطا در دریافت اطلاعات فضا/فایل‌ها:", err);
      const msg = "خطا در گرفتن اطلاعات. لطفاً بعداً دوباره تلاش کنید.";
      setError(msg);
      toastError(getErrMsg(err, msg), { title: "خطا" });
    } finally {
      setLoading(false);
    }
  };

  const refresh = useCooldownAction({
    cooldownMs: 3000,
    toastGapMs: 900,
    isBusy: loading,
    busyMessage: "در حال بروزرسانی هستیم...",
    busyToast: info,
    title: "بروزرسانی",
    onRun: async () => {
      await fetchData(true);
    },
  });

  useEffect(() => {
    fetchData(false);
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  /**
   * ✅ percent دقیقا همون عددی که بک‌اند میده
   * نمونه‌ی شما: 0.06 (یعنی 0.06%)
   * اگر بک‌اند نداد => از used/quota حساب می‌کنیم (به درصد واقعی)
   */
  const percent = useMemo(() => {
    if (usedPercentRaw != null && isFinite(usedPercentRaw)) {
      // همون عدد بک‌اند (بدون ضربدر 100)
      return clamp(usedPercentRaw, 0, 100);
    }
    // fallback: درصد واقعی از نسبت
    return quotaBytes > 0 ? clamp((usedBytes / quotaBytes) * 100, 0, 100) : 0;
  }, [usedPercentRaw, usedBytes, quotaBytes]);

  const filteredSortedFiles = useMemo(() => {
    const q = query.trim().toLowerCase();
    return [...files]
      .filter((f) => {
        if (!q) return true;
        const hay = [f?.name, f?.folderPath].filter(Boolean).join(" ").toLowerCase();
        return hay.includes(q);
      })
      .sort((a, b) => {
        const diff = getFileSize(b) - getFileSize(a);
        return sortDesc ? diff : -diff;
      });
  }, [files, query, sortDesc]);

  const handleMoveToTrash = async (file) => {
    if (!file?.id) return toastError("فایل نامعتبر است.", { title: "خطا" });
    try {
      await Axiosinstance.post(`storage/files/${file.id}/trash/`);
      setFiles((prev) => prev.filter((f) => f.id !== file.id));
      if (selected?.id === file.id) setSelected(null);
      info("فایل به سطل زباله منتقل شد.", { title: "انجام شد" });
    } catch (err) {
      console.error("خطا در انتقال به سطل زباله:", err);
      toastError(getErrMsg(err, "انتقال به سطل زباله ناموفق بود."), { title: "خطا" });
    }
  };

  const handleHardDelete = async (file) => {
    if (!file?.id) return toastError("فایل نامعتبر است.", { title: "خطا" });

    const now = Date.now();
    const armed = hardDeleteArmedRef.current;

    if (!(armed.id === file.id && armed.until > now)) {
      hardDeleteArmedRef.current = { id: file.id, until: now + 6000 };
      toastError("برای حذف دائمی، دوباره روی «حذف دائمی» بزن (تا ۶ ثانیه).", { title: "هشدار" });
      return;
    }

    try {
      await Axiosinstance.delete(`storage/files/${file.id}/hard-delete/`);
      setFiles((prev) => prev.filter((f) => f.id !== file.id));
      if (selected?.id === file.id) setSelected(null);

      hardDeleteArmedRef.current = { id: null, until: 0 };
      success("فایل حذف دائمی شد.", { title: "موفق" });
    } catch (err) {
      console.error("خطا در حذف دائمی:", err);
      toastError(getErrMsg(err, "حذف دائمی فایل ناموفق بود."), { title: "خطا" });
    }
  };

  return (
    <div className="w-full dark:text-white text-black min-w-0">
      <PageHeader
        title="فضای ذخیره‌سازی"
        subtitle="وضعیت مصرف فضای شما روی سرور + فایل‌های حجیم‌تر"
        right={
          <>
            <Button
              type="button"
              onClick={refresh.run}
              disabled={refresh.disabled}
              variant="outline"
              size="lg"
              title={refresh.leftMs > 0 ? `تا ${Math.ceil(refresh.leftMs / 1000)} ثانیه دیگر` : "بروزرسانی اطلاعات"}
              leftIcon={<LuRefreshCcw className={`w-4 h-4 text-[#43BEFF] dark:text-white ${loading ? "animate-spin" : ""}`} />}
            >
              {loading ? "درحال بروزرسانی..." : "بروزرسانی"}
            </Button>

            <SpaceStatusBadge percent={percent} />
          </>
        }
      />

      {error ? (
        <div className="mb-4 p-4 rounded-xl shadow border border-red-500/30 bg-red-500/10 text-sm">{error}</div>
      ) : null}

      <div className="grid gap-5 lg:grid-cols-3 min-w-0">
        <SpaceUsageCard
          usedBytes={usedBytes}
          quotaBytes={quotaBytes}
          remainingBytes={remainingBytes}
          percent={percent}
          filesCount={files.length}
          sortDesc={sortDesc}
          onToggleSort={() => setSortDesc((p) => !p)}
          onSortToast={info}
        />
        <SpaceQuickSummaryCard usedBytes={usedBytes} quotaBytes={quotaBytes} remainingBytes={remainingBytes} />
      </div>

      <div className="mt-7 grid gap-5 lg:grid-cols-3 min-w-0">
        <SpaceFilesCard
          loading={loading}
          files={filteredSortedFiles}
          selectedId={selected?.id || null}
          onSelect={setSelected}
          query={query}
          onQueryChange={setQuery}
          onMoveToTrash={handleMoveToTrash}
          onHardDelete={handleHardDelete}
        />

        <SpaceFileDetailsCard
          selected={selected}
          onClearSelected={() => setSelected(null)}
          onMoveToTrash={handleMoveToTrash}
          onHardDelete={handleHardDelete}
        />
      </div>
    </div>
  );
}
