// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
package dev.kreuzberg;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import org.jspecify.annotations.Nullable;

/**
 * Dublin Core metadata from docProps/core.xml
 *
 * Contains standard metadata fields defined by the Dublin Core standard
 * and Office-specific extensions.
 */
@JsonInclude(JsonInclude.Include.NON_ABSENT)
@JsonDeserialize(builder = CoreProperties.Builder.class)
public record CoreProperties(
    /**
     * Document title
     */
    @Nullable @JsonProperty("title") String title,
    /**
     * Document subject/topic
     */
    @Nullable @JsonProperty("subject") String subject,
    /**
     * Document creator/author
     */
    @Nullable @JsonProperty("creator") String creator,
    /**
     * Keywords or tags
     */
    @Nullable @JsonProperty("keywords") String keywords,
    /**
     * Document description/abstract
     */
    @Nullable @JsonProperty("description") String description,
    /**
     * User who last modified the document
     */
    @Nullable @JsonProperty("last_modified_by") String lastModifiedBy,
    /**
     * Revision number
     */
    @Nullable @JsonProperty("revision") String revision,
    /**
     * Creation timestamp (ISO 8601)
     */
    @Nullable @JsonProperty("created") String created,
    /**
     * Last modification timestamp (ISO 8601)
     */
    @Nullable @JsonProperty("modified") String modified,
    /**
     * Document category
     */
    @Nullable @JsonProperty("category") String category,
    /**
     * Content status (Draft, Final, etc.)
     */
    @Nullable @JsonProperty("content_status") String contentStatus,
    /**
     * Document language
     */
    @Nullable @JsonProperty("language") String language,
    /**
     * Unique identifier
     */
    @Nullable @JsonProperty("identifier") String identifier,
    /**
     * Document version
     */
    @Nullable @JsonProperty("version") String version,
    /**
     * Last print timestamp (ISO 8601)
     */
    @Nullable @JsonProperty("last_printed") String lastPrinted
) {
    public static Builder builder() {
        return new Builder();
    }

    // CPD-OFF
    @JsonPOJOBuilder(withPrefix = "with", buildMethodName = "build")
    public static final class Builder {

private String title = null;
private String subject = null;
private String creator = null;
private String keywords = null;
private String description = null;
        @JsonProperty("last_modified_by")
private String lastModifiedBy = null;
private String revision = null;
private String created = null;
private String modified = null;
private String category = null;
        @JsonProperty("content_status")
private String contentStatus = null;
private String language = null;
private String identifier = null;
private String version = null;
        @JsonProperty("last_printed")
private String lastPrinted = null;

        /** Sets the title field. */
        @JsonProperty("title")
        public Builder withTitle(final @Nullable String value) {
            this.title = value;
            return this;
        }

        /** Sets the subject field. */
        @JsonProperty("subject")
        public Builder withSubject(final @Nullable String value) {
            this.subject = value;
            return this;
        }

        /** Sets the creator field. */
        @JsonProperty("creator")
        public Builder withCreator(final @Nullable String value) {
            this.creator = value;
            return this;
        }

        /** Sets the keywords field. */
        @JsonProperty("keywords")
        public Builder withKeywords(final @Nullable String value) {
            this.keywords = value;
            return this;
        }

        /** Sets the description field. */
        @JsonProperty("description")
        public Builder withDescription(final @Nullable String value) {
            this.description = value;
            return this;
        }

        /** Sets the lastModifiedBy field. */
        @JsonProperty("last_modified_by")
        public Builder withLastModifiedBy(final @Nullable String value) {
            this.lastModifiedBy = value;
            return this;
        }

        /** Sets the revision field. */
        @JsonProperty("revision")
        public Builder withRevision(final @Nullable String value) {
            this.revision = value;
            return this;
        }

        /** Sets the created field. */
        @JsonProperty("created")
        public Builder withCreated(final @Nullable String value) {
            this.created = value;
            return this;
        }

        /** Sets the modified field. */
        @JsonProperty("modified")
        public Builder withModified(final @Nullable String value) {
            this.modified = value;
            return this;
        }

        /** Sets the category field. */
        @JsonProperty("category")
        public Builder withCategory(final @Nullable String value) {
            this.category = value;
            return this;
        }

        /** Sets the contentStatus field. */
        @JsonProperty("content_status")
        public Builder withContentStatus(final @Nullable String value) {
            this.contentStatus = value;
            return this;
        }

        /** Sets the language field. */
        @JsonProperty("language")
        public Builder withLanguage(final @Nullable String value) {
            this.language = value;
            return this;
        }

        /** Sets the identifier field. */
        @JsonProperty("identifier")
        public Builder withIdentifier(final @Nullable String value) {
            this.identifier = value;
            return this;
        }

        /** Sets the version field. */
        @JsonProperty("version")
        public Builder withVersion(final @Nullable String value) {
            this.version = value;
            return this;
        }

        /** Sets the lastPrinted field. */
        @JsonProperty("last_printed")
        public Builder withLastPrinted(final @Nullable String value) {
            this.lastPrinted = value;
            return this;
        }

        /** Builds the CoreProperties instance. */
        public CoreProperties build() {
            return new CoreProperties(
                title,
                subject,
                creator,
                keywords,
                description,
                lastModifiedBy,
                revision,
                created,
                modified,
                category,
                contentStatus,
                language,
                identifier,
                version,
                lastPrinted
            );
        }
    }
    // CPD-ON
}
