import React from 'react';

import { Document, Link, 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 { Event, EventInstitutionField } from '@/types/Events';

import { buildEventPdfItems } from './eventsPdfData';

export type EventsPdfLabels = {
  affectedCreator: string;
  affectedCreators: string;
  info: string;
  listTitle?: string;
  location: string;
  ticket: string;
};

interface EventsPDFDocumentProps {
  events: Event[];
  dateRange?: string;
  getLocationString: (institutionField: EventInstitutionField) => string | null;
  labels: EventsPdfLabels;
  locale: string;
  title?: string;
}

const EventsPDFDocument: React.FC<EventsPDFDocumentProps> = ({
  events,
  dateRange,
  getLocationString,
  labels,
  locale,
  title = '',
}) => {
  const pdfItems = buildEventPdfItems(events, { getLocationString, locale });

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

        {pdfItems.map((event) => (
          <View key={event.id}>
            <View style={pdfStyles.contentBlock}>
              <Text style={pdfStyles.itemDate}>{event.timeLabel}</Text>
              <Text style={pdfStyles.contentTitle}>{event.title}</Text>

              {event.location && (
                <Text style={pdfStyles.bodyText}>
                  <Text style={pdfStyles.label}>{labels.location}</Text> {event.location}
                </Text>
              )}

              {event.descriptionParagraphs.map((paragraph, index) => (
                <Text key={`${event.id}-description-${index}`} style={pdfStyles.bodyText}>
                  {paragraph}
                </Text>
              ))}

              {event.persons.length > 0 && (
                <View>
                  <Text style={pdfStyles.bodyText}>
                    <Text style={pdfStyles.label}>
                      {event.persons.length > 1
                        ? `${labels.affectedCreators} `
                        : `${labels.affectedCreator} `}
                    </Text>
                    {event.persons.map((person, index) => (
                      <Text key={person.id}>
                        <Link src={person.url} style={pdfStyles.link}>
                          {person.name}
                        </Link>
                        {person.profession && ` ${person.profession}`}
                        {index < event.persons.length - 1 && ', '}
                      </Text>
                    ))}
                  </Text>
                </View>
              )}

              {(event.infoUrl || event.ticketUrl) && (
                <Text style={pdfStyles.bodyText}>
                  {event.infoUrl && (
                    <Link src={event.infoUrl} style={pdfStyles.link}>
                      {labels.info}
                    </Link>
                  )}
                  {event.infoUrl && event.ticketUrl && ' | '}
                  {event.ticketUrl && (
                    <Link src={event.ticketUrl} style={pdfStyles.link}>
                      {labels.ticket}
                    </Link>
                  )}
                </Text>
              )}
            </View>
          </View>
        ))}
      </Page>
    </Document>
  );
};

export default EventsPDFDocument;
