"use client";

import * as React from "react";
import { FileDown, FileSpreadsheet, Loader2 } from "lucide-react";
import { toast } from "sonner";
import { Button } from "@/components/ui/button";
import { ButtonGroup } from "@/components/ui/button-group";
import {
  Tooltip,
  TooltipContent,
  TooltipProvider,
  TooltipTrigger,
} from "@/components/ui/tooltip";
import {
  useLazyExportMarketingAnalyticsExcelQuery,
  useLazyExportMarketingAnalyticsPdfQuery,
  type MarketingAnalyticsQuery,
} from "@/api/rtk/marketing-api";
import { downloadBlob } from "@/lib/download-blob";

type MarketingAnalyticsExportActionsProps = {
  query: MarketingAnalyticsQuery;
  disabled?: boolean;
  filePrefix?: string;
};

export function MarketingAnalyticsExportActions({
  query,
  disabled = false,
  filePrefix = "marketing-analytics",
}: MarketingAnalyticsExportActionsProps) {
  const [exportExcel, { isFetching: exportingExcel }] =
    useLazyExportMarketingAnalyticsExcelQuery();
  const [exportPdf, { isFetching: exportingPdf }] =
    useLazyExportMarketingAnalyticsPdfQuery();

  const exporting = exportingExcel || exportingPdf;
  const stamp = new Date().toISOString().slice(0, 10);

  const handleExportExcel = React.useCallback(async () => {
    if (disabled) {
      toast.error("Apply filters and load analytics data before exporting.");
      return;
    }
    const toastId = toast.loading("Generating Excel export…");
    try {
      const blob = await exportExcel(query).unwrap();
      downloadBlob(
        blob,
        `${filePrefix}_${stamp}.xlsx`,
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      );
      toast.success("Excel ready — check your downloads", { id: toastId });
    } catch (err) {
      const message =
        err instanceof Error ? err.message : "Could not generate the Excel file.";
      toast.error(message, { id: toastId });
    }
  }, [disabled, exportExcel, filePrefix, query, stamp]);

  const handleExportPdf = React.useCallback(async () => {
    if (disabled) {
      toast.error("Apply filters and load analytics data before exporting.");
      return;
    }
    const toastId = toast.loading("Generating PDF export…");
    try {
      const blob = await exportPdf(query).unwrap();
      downloadBlob(blob, `${filePrefix}_${stamp}.pdf`, "application/pdf");
      toast.success("PDF ready — check your downloads", { id: toastId });
    } catch (err) {
      const message =
        err instanceof Error ? err.message : "Could not generate the PDF.";
      toast.error(message, { id: toastId });
    }
  }, [disabled, exportPdf, filePrefix, query, stamp]);

  return (
    <TooltipProvider delayDuration={200}>
      <ButtonGroup aria-label="Export marketing analytics">
        <Tooltip>
          <TooltipTrigger asChild>
            <Button
              type="button"
              variant="outline"
              size="icon-sm"
              className="border-black/10 bg-white text-[#575a62] hover:border-[#6C63FF]/40 hover:text-[#6C63FF]"
              disabled={disabled || exporting}
              onClick={() => void handleExportPdf()}
              aria-label={
                exportingPdf ? "Exporting PDF" : "Export analytics as PDF"
              }
            >
              {exportingPdf ? (
                <Loader2 className="size-4 animate-spin" aria-hidden />
              ) : (
                <FileDown className="size-4" aria-hidden />
              )}
            </Button>
          </TooltipTrigger>
          <TooltipContent>
            <p>{exportingPdf ? "Exporting PDF…" : "Export as PDF"}</p>
          </TooltipContent>
        </Tooltip>
        <Tooltip>
          <TooltipTrigger asChild>
            <Button
              type="button"
              variant="outline"
              size="icon-sm"
              className="border-black/10 bg-white text-[#575a62] hover:border-[#6C63FF]/40 hover:text-[#6C63FF]"
              disabled={disabled || exporting}
              onClick={() => void handleExportExcel()}
              aria-label={
                exportingExcel ? "Exporting Excel" : "Export analytics as Excel"
              }
            >
              {exportingExcel ? (
                <Loader2 className="size-4 animate-spin" aria-hidden />
              ) : (
                <FileSpreadsheet className="size-4" aria-hidden />
              )}
            </Button>
          </TooltipTrigger>
          <TooltipContent>
            <p>{exportingExcel ? "Exporting Excel…" : "Export as Excel"}</p>
          </TooltipContent>
        </Tooltip>
      </ButtonGroup>
    </TooltipProvider>
  );
}
