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 { pdfStyles } from '@/components/pdf/PdfStyles';
import { normalizePdfText } from '@/components/pdf/pdfUtils';

import { CreationListItem } from '@/types/Creation';

import { buildCreatorLifeEventPdfGroups } from './creatorLifeEventsPdfData';

export type CreatorLifeEventsPdfLabels = {
  eventCountPlural: string;
  eventCountSingular: string;
  title: string;
  unknownType: string;
};

interface CreatorLifeEventsPDFDocumentProps {
  creatorName: string;
  creatorProfession?: string | null;
  events: CreationListItem[];
  labels: CreatorLifeEventsPdfLabels;
  locale: string;
}

const CreatorLifeEventsPDFDocument: React.FC<CreatorLifeEventsPDFDocumentProps> = ({
  creatorName,
  creatorProfession,
  events,
  labels,
  locale,
}) => {
  const profession = normalizePdfText(creatorProfession);
  const groups = buildCreatorLifeEventPdfGroups(events, {
    locale,
    unknownTypeLabel: labels.unknownType,
  });

  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.typeLabel}</Text>
              </View>
            </View>
          );

          const renderItem = (event: (typeof group.events)[number]) => (
            <View style={pdfStyles.item} wrap={false}>
              {event.dateLabel && <Text style={pdfStyles.itemDate}>{event.dateLabel}</Text>}
              {event.title && <Text style={pdfStyles.itemTitle}>{event.title}</Text>}
              {event.location && <Text style={pdfStyles.itemMeta}>{event.location}</Text>}
            </View>
          );

          return (
            <View key={group.typeLabel} style={pdfStyles.contentBlock}>
              {group.events.map((event, eventIndex) =>
                // Keep the group header glued to its first event so the header
                // can never be orphaned at the bottom of a page.
                eventIndex === 0 ? (
                  <View key={event.key} wrap={false}>
                    {header}
                    {renderItem(event)}
                  </View>
                ) : (
                  <React.Fragment key={event.key}>{renderItem(event)}</React.Fragment>
                )
              )}
            </View>
          );
        })}
      </Page>
    </Document>
  );
};

export default CreatorLifeEventsPDFDocument;
