import type { ActionFunctionArgs, LoaderFunctionArgs } from "react-router";
import { authenticateAdminRequest } from "../services/admin-auth.server";
import {
  exportStoresCSV,
  exportCustomersCSV,
  exportTransactionsCSV,
  exportRevenueCSV,
} from "../services/admin.server";
import prisma from "../db.server";

const handleExport = async (request: Request) => {
  const authResult = authenticateAdminRequest(request);

  if (!authResult.isAuthenticated) {
    return new Response("Unauthorized SaaS admin request", { status: 401 });
  }

  const url = new URL(request.url);
  const type = url.searchParams.get("type") || "stores";
  const unmask = url.searchParams.get("unmask") === "true";
  const dateStr = new Date().toISOString().split("T")[0];

  let csvContent = "";
  let filename = "";

  // Audit log export action
  try {
    const firstShop = await prisma.shop.findFirst();
    if (firstShop) {
      await prisma.auditLog.create({
        data: {
          shopId: firstShop.id,
          action: `CSV Export (${type})`,
          resource: `Unmasked PII: ${unmask}`,
          status: "SUCCESS",
        },
      });
    }
  } catch (e) {}

  if (type === "stores") {
    csvContent = await exportStoresCSV(unmask);
    filename = `stores-${dateStr}.csv`;
  } else if (type === "customers") {
    csvContent = await exportCustomersCSV(unmask);
    filename = `customers-${dateStr}.csv`;
  } else if (type === "transactions") {
    csvContent = await exportTransactionsCSV(unmask);
    filename = `transactions-${dateStr}.csv`;
  } else if (type === "revenue") {
    csvContent = await exportRevenueCSV();
    filename = `revenue-${dateStr}.csv`;
  } else {
    return new Response("Invalid export type parameter", { status: 400 });
  }

  return new Response(csvContent, {
    status: 200,
    headers: {
      "Content-Type": "text/csv; charset=utf-8",
      "Content-Disposition": `attachment; filename="${filename}"`,
      "Cache-Control": "no-store, no-cache, must-revalidate",
    },
  });
};

export const loader = async ({ request }: LoaderFunctionArgs) => handleExport(request);
export const action = async ({ request }: ActionFunctionArgs) => handleExport(request);
