import type { Block } from './layout.ts';
import type { BoxLengths, Length, Orientation, PaperSize } from './sizes.ts';
import type { TextProps } from './text.ts';
/**
 * The complete definition of a PDF document to create.
 */
export type DocumentDefinition = {
    /**
     * The default language of the document, expressed as a BCP 47 tag
     * (e.g. `'en'`, `'de'`, `'ar'`, `'zh-Hans'`).
     *
     * Setting the language helps assistive technologies and improves
     * language-aware text shaping when no more specific language is
     * provided.
     */
    language?: string;
    /**
     * A content block that is printed at the top of each page.
     * A function can be passed to create page-specific headers.
     */
    header?: Block | ((info: PageInfo) => Block);
    /**
     * A content block that is printed at the bottom of each page.
     * A function can be passed to create page-specific footers.
     */
    footer?: Block | ((info: PageInfo) => Block);
    /**
     * The sequence of blocks that contain the document's content.
     */
    content: Block[];
    /**
     * The default style properties to use in the document.
     */
    defaultStyle?: TextProps;
    /**
     * The page size of the document. Defaults to A4.
     */
    pageSize?: PaperSize;
    /**
     * The orientation of the pages in the document. When this parameter is set, width and height
     * of the given page size will be reversed if necessary to match the given orientation.
     */
    pageOrientation?: Orientation;
    /**
     * The margin to leave around the page content area, relative to header and footer.
     * That is, if a header is specified, the top margin defines the vertical distance from the
     * header, otherwise from the top of the page.
     * The bottom margin defines the vertical distance from the footer or, if there is no footer,
     * from the bottom of the page.
     * A function can be passed to create page-specific margins.
     *
     * Defaults to `50pt` on each side.
     */
    margin?: Length | BoxLengths | ((info: PageInfo) => Length | BoxLengths);
    /**
     * Metadata to include in the PDF's *document information dictionary*.
     */
    info?: InfoProps & CustomInfoProps;
    /**
     * Custom data to be added to the PDF *document catalog*. This
     * property should only be used by PDF applications that need to
     * include custom data in a PDF document. To avoid name collisions,
     * keys should be prefixed with `XX`.
     *
     * See [PDF 1.7, Appendix E - PDF Name
     * Registry](https://archive.org/details/pdf1.7/page/n1017/mode/2up)
     */
    customData?: Record<`XX${string}`, string | Uint8Array>;
    /**
     * Files to be stored directly within a PDF document. These files can
     * be displayed and extracted by PDF viewers and other tools.
     */
    embeddedFiles?: EmbeddedFile[];
    /**
     * Output intents that describe the intended output conditions for the
     * document (e.g. for PDF/A or PDF/X conformance).
     */
    outputIntents?: OutputIntent[];
    /**
     * Custom XMP metadata fragments to merge into the document's
     * auto-generated XMP metadata. Each fragment declares a namespace
     * and provides raw XML content for that namespace.
     */
    xmpFragments?: XmpFragment[];
    dev?: {
        /**
         * When set to true, additional guides are drawn to help analyzing
         * the layout. A thin rectangle is drawn around each rendered frame.
         * Margins are given a semi-transparent yellow background and
         * padding areas are shown in blue.
         */
        guides?: boolean;
    };
};
/**
 * Describes the relationship between the embedded file and the PDF
 * document.
 * - `Source`: The embedded file is the source material for the
 *   document.
 * - `Data`: The embedded file contains data related to the document.
 * - `Alternative`: The embedded file is an alternative representation
 *   of the document.
 * - `Supplement`: The embedded file supplements the document.
 * - `EncryptedPayload`: The embedded file is an encrypted payload.
 * - `FormData`: The embedded file contains form data.
 * - `Schema`: The embedded file contains a schema.
 * - `Unspecified`: No specific relationship.
 */
export type FileRelationShip = 'Source' | 'Data' | 'Alternative' | 'Supplement' | 'EncryptedPayload' | 'FormData' | 'Schema' | 'Unspecified';
export type EmbeddedFile = {
    /**
     * The binary content of the file.
     */
    content: Uint8Array;
    /**
     * The MIME type of the file.
     */
    mimeType: string;
    /**
     * The name of the file as it will appear in the list of attachments
     * in the PDF viewer.
     */
    fileName: string;
    /**
     * A brief description of the file's content or purpose. This text
     * can also be displayed by the PDF viewer.
     */
    description?: string;
    /**
     * The date and time when the file was created.
     */
    creationDate?: Date;
    /**
     * The date and time when the file was last modified.
     */
    modificationDate?: Date;
    /**
     * The relationship between the file and the PDF document.
     */
    relationship?: FileRelationShip;
};
/**
 * Standard metadata properties to include in the PDF's *document
 * information dictionary*. These properties are usually displayed by
 * PDF viewers.
 */
export type InfoProps = {
    /**
     * The document’s title.
     */
    title?: string;
    /**
     * The name of the person who created the document.
     */
    author?: string;
    /**
     * The subject of the document.
     */
    subject?: string;
    /**
     * Keywords associated with the document.
     */
    keywords?: string[];
    /**
     * The date and time the document was created (defaults to current
     * time).
     */
    creationDate?: Date;
    /**
     * The name of the application that created the original content.
     */
    creator?: string;
    /**
     * The name of the application that created the PDF.
     */
    producer?: string;
};
/**
 * Custom metadata properties to include in the PDF's *document
 * information dictionary*. These properties should be prefixed with
 * `XX` to avoid name collisions.
 */
export type CustomInfoProps = Record<`XX${string}`, string>;
/**
 * Information about the current page, provided to functions that create
 * page-specific headers, footers, and margins.
 */
export type PageInfo = {
    /**
     * The size of the current page in pt.
     */
    readonly pageSize: {
        width: number;
        height: number;
    };
    /**
     * The number of the current page, starting at 1.
     */
    readonly pageNumber: number;
    /**
     * The total number of pages.
     * This value is only available after the layout of the entire document has finished.
     * Before that, it is `undefined`.
     */
    readonly pageCount?: number;
};
/**
 * An output intent that describes the intended output condition for the
 * document. Output intents are required for PDF/A and PDF/X conformance.
 */
export type OutputIntent = {
    /**
     * The output intent subtype, e.g. `'GTS_PDFA1'` for PDF/A or
     * `'GTS_PDFX'` for PDF/X.
     */
    subtype: string;
    /**
     * An identifier for the intended output condition, e.g.
     * `'sRGB IEC61966-2.1'`.
     */
    outputConditionIdentifier: string;
    /**
     * The raw ICC profile data for the destination output condition.
     */
    iccProfile: Uint8Array;
    /**
     * A human-readable description of the intended output condition.
     */
    outputCondition?: string;
    /**
     * A URL for an ICC profile registry where the condition is defined.
     */
    registryName?: string;
    /**
     * Additional information about the intended output condition.
     */
    info?: string;
};
/**
 * A fragment of XMP metadata scoped to a single namespace, to be
 * merged into the document's auto-generated XMP.
 */
export type XmpFragment = {
    /**
     * The namespace URI (e.g. `'http://www.aiim.org/pdfa/ns/id/'`).
     */
    namespaceUri: string;
    /**
     * The namespace prefix used in the XML content (e.g. `'pdfaid'`).
     */
    prefix: string;
    /**
     * Raw XML content to place inside the `rdf:Description` element.
     * The caller is responsible for ensuring the XML is well-formed.
     */
    unsafeInnerXML: string;
};
