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";
import { generatePDFData } from "@/src/services/admin/services";

const FORM_TITLES = {
  hip: "Home Improvement Program Application",
  fthb: "First-Time Home Buyer Assistance Application",
  tmr: "Tenant Maintenance Request",
} as const;

const FORM_FILENAMES = {
  hip: "Home_Improvement_Application",
  fthb: "First_Time_Buyer_Application",
  tmr: "Tenant_Maintenance_Request",
} as const;

type ApplicationType = "hip" | "fthb" | "tmr";

const renderPDFContent = (formData: any, formType: ApplicationType) => {
  switch (formType) {
    case "hip":
      return <HomeImprovementPDFContent formData={formData} />;
    case "fthb":
      return <FirstTimeBuyerPDFContent formData={formData} />;
    case "tmr":
      return <TenantMaintenancePDFContent formData={formData} />;
    default:
      return null;
  }
};

export const generatePDFDocument = (formData: any, formType: ApplicationType) => (
  <Document>
    <Page size="A4" style={pdfStyles.page}>
      <View fixed>
        <PDFHeader />
      </View>
      <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 fetchApplicationData = async (
  applicationId: number,
  applicationType: ApplicationType
): Promise<{ success: boolean; data?: any; error?: string }> => {
  try {
    const response = await generatePDFData(applicationId, applicationType);
    const raw = response.data.data;

    if (applicationType === 'hip') {
      const hip = raw.hipApplication || raw;
      return {
        success: true,
        data: {
          ...raw,
          certificationSignature: hip.certification_signature,
          certificationSignerName: hip.certification_signer_name,
          certificationDateTime: hip.certification_datetime,
          certificationCoApplicantSignature: hip.certification_coapplicant_signature,
          certificationCoApplicantSignerName: hip.certification_coapplicant_signer_name,
          certificationCoApplicantDateTime: hip.certification_coapplicant_datetime,
          employmentAuthSignature: hip.employment_auth_signature,
          employmentAuthSignerName: hip.employment_auth_signer_name,
          employmentAuthDateTime: hip.employment_auth_datetime,
          employmentAuthCoApplicantSignature: hip.employment_auth_coapplicant_signature,
          employmentAuthCoApplicantSignerName: hip.employment_auth_coapplicant_signer_name,
          employmentAuthCoApplicantDateTime: hip.employment_auth_coapplicant_datetime,
          inspectionAuthSignature: hip.inspection_auth_signature,
          inspectionAuthSignerName: hip.inspection_auth_signer_name,
          inspectionAuthDateTime: hip.inspection_auth_datetime,
          inspectionAuthCoApplicantSignature: hip.inspection_auth_coapplicant_signature,
          inspectionAuthCoApplicantSignerName: hip.inspection_auth_coapplicant_signer_name,
          inspectionAuthCoApplicantDateTime: hip.inspection_auth_coapplicant_datetime,
          bidResponsibilitySignature: hip.bid_responsibility_signature,
          bidResponsibilitySignerName: hip.bid_responsibility_signer_name,
          bidResponsibilityDateTime: hip.bid_responsibility_datetime,
         subordinationSignature: hip.subordination_signature,
subordinationSignerName: hip.subordination_signer_name,
subordinationDateTime: hip.subordination_datetime,
subordinationCoapplicantSignature: hip.subordination_coapplicant_signature,
subordinationCoapplicantSignerName: hip.subordination_coapplicant_signer_name,
subordinationCoapplicantDateTime: hip.subordination_coapplicant_datetime,
        }
      };
    }

    return { success: true, data: raw };
  } catch (error: any) {
    console.error("Error fetching application data:", error);
    return {
      success: false,
      error: error?.response?.data?.error || "Failed to fetch application data.",
    };
  }
};

export const downloadApplicationPDF = async (
  applicationId: number,
  applicationType: ApplicationType
): Promise<{ success: boolean; error?: string }> => {
  try {
    const result = await fetchApplicationData(applicationId, applicationType);
    if (!result.success || !result.data) {
      return { success: false, error: result.error };
    }

    const doc = generatePDFDocument(result.data, applicationType);
    const blob = await pdf(doc).toBlob();
    const filename = `${FORM_FILENAMES[applicationType]}_${applicationId}_${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?.response?.data?.error || "Failed to generate PDF. Please try again.",
    };
  }
};

export const getFormTitle = (formType: ApplicationType) => FORM_TITLES[formType];
export const getFormFilename = (formType: ApplicationType, applicationId: number) => 
  `${FORM_FILENAMES[formType]}_${applicationId}_${new Date().getTime()}.pdf`;
