import { pdf, Document, Page, Text, View } from "@react-pdf/renderer";
import { pdfStyles } from "@/src/components/common/pdf/PDFStyles";
import { PDFHeader } from "@/src/components/common/pdf/PDFHeader";
import { HomeImprovementPDFContent } from "@/src/components/common/pdf/HomeImprovementPDF";
import { FirstTimeBuyerPDFContent } from "@/src/components/common/pdf/FirstTimeBuyerPDF";
import { TenantMaintenancePDFContent } from "@/src/components/common/pdf/TenantMaintenancePDF";

const FORM_TITLES = {
  "home-improvement": "Home Improvement Program Application",
  "first-time-buyer": "First-Time Home Buyer Assistance Application",
  "tenant-maintenance": "Tenant Maintenance Request",
} as const;

const FORM_FILENAMES = {
  "home-improvement": "Home_Improvement_Application",
  "first-time-buyer": "First_Time_Buyer_Application",
  "tenant-maintenance": "Tenant_Maintenance_Request",
} as const;

type FormType = "home-improvement" | "first-time-buyer" | "tenant-maintenance";

const renderPDFContent = (formData: any, formType: FormType) => {
  switch (formType) {
    case "home-improvement":
      return <HomeImprovementPDFContent formData={formData} />;
    case "first-time-buyer":
      return <FirstTimeBuyerPDFContent formData={formData} />;
    case "tenant-maintenance":
      return <TenantMaintenancePDFContent formData={formData} />;
    default:
      return null;
  }
};

export const generatePDFDocument = (formData: any, formType: FormType) => (
  <Document>
    <Page size="A4" style={pdfStyles.page}>
      <View fixed>
        <PDFHeader />
      </View>
      {
        FORM_TITLES[formType] !== 'Home Improvement Program Application' && (
          <>
            <Text style={pdfStyles.title}>2025 Program Year</Text>
            <Text style={pdfStyles.title}>{FORM_TITLES[formType]}</Text>
            <Text style={pdfStyles.date}></Text>
          </>
        )
      }

      {renderPDFContent(formData, formType)}

    </Page>
  </Document>
);

export const downloadFormPDF = async (
  formData: any,
  formType: FormType
): Promise<{ success: boolean; error?: string }> => {
  try {
    const doc = generatePDFDocument(formData, formType);
    const blob = await pdf(doc).toBlob();
    const filename = `${FORM_FILENAMES[formType]}_${new Date().getTime()}.pdf`;

    const url = URL.createObjectURL(blob);
    const link = document.createElement("a");
    link.href = url;
    link.download = filename;
    link.click();
    URL.revokeObjectURL(url);

    return { success: true };
  } catch (error: any) {
    console.error("Error generating PDF:", error);
    return {
      success: false,
      error: error?.message || "Failed to generate PDF. Please try again.",
    };
  }
};

export const getFormTitle = (formType: FormType) => FORM_TITLES[formType];
export const getFormFilename = (formType: FormType) =>
  `${FORM_FILENAMES[formType]}_${new Date().getTime()}.pdf`;
