import React from 'react';

import { Document, Page, Text, View } from '@react-pdf/renderer';

import PdfDocumentTitle from '@/components/pdf/PdfDocumentTitle';
import PdfHeader from '@/components/pdf/PdfHeader';
import { pdfColors, pdfStyles } from '@/components/pdf/PdfStyles';
import { normalizePdfText } from '@/components/pdf/pdfUtils';

import { CreatorAward } from '@/types/Award';

import { buildCreatorAwardPdfGroups } from './creatorAwardsPdfData';

export type CreatorAwardsPdfLabels = {
  otherGroupLabel: string;
  stateGroupLabel: string;
  title: string;
};

interface CreatorAwardsPDFDocumentProps {
  awards: CreatorAward[];
  creatorName: string;
  creatorProfession?: string | null;
  labels: CreatorAwardsPdfLabels;
}

const CreatorAwardsPDFDocument: React.FC<CreatorAwardsPDFDocumentProps> = ({
  awards,
  creatorName,
  creatorProfession,
  labels,
}) => {
  const profession = normalizePdfText(creatorProfession);
  const groups = buildCreatorAwardPdfGroups(awards, {
    otherGroupLabel: labels.otherGroupLabel,
    stateGroupLabel: labels.stateGroupLabel,
  });

  return (
    <Document>
      <Page size="A4" style={pdfStyles.page}>
        <PdfHeader title={creatorName} subtitle={profession} />
        <PdfDocumentTitle title={labels.title} />

        {groups.map((group) => {
          const header = (
            <View style={pdfStyles.contentHeader}>
              <View style={pdfStyles.contentTitleWrap}>
                <Text style={pdfStyles.contentTitle}>{group.groupLabel}</Text>
              </View>
            </View>
          );

          const renderItem = (award: (typeof group.awards)[number]) => (
            <View style={pdfStyles.item} wrap={false}>
              {award.yearLabel && <Text style={pdfStyles.itemDate}>{award.yearLabel}</Text>}
              {award.title && <Text style={pdfStyles.itemTitle}>{award.title}</Text>}
              {award.description && (
                <Text style={[pdfStyles.bodyText, { marginTop: 4 }]}>{award.description}</Text>
              )}
            </View>
          );

          return (
            <View
              key={group.groupLabel}
              style={[
                pdfStyles.contentBlock,
                group.isStateGroup ? { borderLeftColor: pdfColors.gold } : {},
              ]}
            >
              {group.awards.map((award, awardIndex) =>
                // Keep the group header glued to its first award so the header
                // can never be orphaned at the bottom of a page.
                awardIndex === 0 ? (
                  <View key={award.key} wrap={false}>
                    {header}
                    {renderItem(award)}
                  </View>
                ) : (
                  <React.Fragment key={award.key}>{renderItem(award)}</React.Fragment>
                )
              )}
            </View>
          );
        })}
      </Page>
    </Document>
  );
};

export default CreatorAwardsPDFDocument;
