package cloud.nstart.terravault.ordinis.restapi.dto.schemaworkflow;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.JsonNode;

/**
 * Partial update черновика без recreate. Полезно maker'у после
 * {@code CHANGES_REQUESTED} — вместо withdraw + create нового draft'а
 * (с потерей id, history, reviewer assignment'ов) — обновляем content
 * существующего.
 *
 * <p>Endpoint: {@code PATCH /api/v1/dictionaries/{name}/drafts/{draftId}}.
 *
 * <p>Status-gate (enforced backend'ом):
 * <ul>
 *   <li>{@code DRAFT} — OK.</li>
 *   <li>{@code CHANGES_REQUESTED} — OK; status переводится обратно в
 *       {@code DRAFT} автоматически (maker должен ре-submit).</li>
 *   <li>{@code REVIEW_PENDING} / {@code APPROVED} — 409 invalid_transition.
 *       Pending review не должен ловить moving target; approved content
 *       freezing до publish.</li>
 *   <li>Terminal — 409.</li>
 * </ul>
 *
 * <p>Все поля optional. Если null — соответствующее поле draft'а не
 * меняется. Это позволяет, например, обновить только reason без замены
 * proposedSchema.
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
public record UpdateSchemaDraftRequest(
    /** Replacement JSON Schema (full document). null = не меняем. */
    JsonNode proposedSchema,
    /** Новая maker rationale. null = не меняем. */
    String reason) {}
