<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd">

  <!--
    Approval Workflow v2 — Phase 3 fix.

    BUG (exposed by e2e): Hibernate с @Enumerated(EnumType.STRING) пишет значения
    enum'а в UPPER CASE (PENDING, APPROVED, REJECTED, WITHDRAWN). А Liquibase 0019
    объявил check constraint + exclusion WHERE с lowercase ('pending'). Любой
    insert PENDING draft'а проваливал check constraint, маппился в
    DataIntegrityViolationException, и DraftService.submit ловил это как
    draft_already_pending — маскируя реальную причину.

    Fix: переписать ограничения с UPPERCASE значениями (matches Java enum norm).
    Существующих PENDING-row быть не должно (insert никогда не проходил), но на
    всякий случай конвертируем lowercase → UPPERCASE до пересоздания constraint'ов.
  -->
  <changeSet id="0020-1-normalize-existing-status" author="ordinis">
    <comment>Normalize any prior lowercase status values to UPPERCASE before recreate.</comment>
    <sql>UPDATE record_drafts SET status = UPPER(status) WHERE status != UPPER(status);</sql>
  </changeSet>

  <changeSet id="0020-2-fix-status-check" author="ordinis">
    <comment>Recreate status check constraint with UPPERCASE values matching enum.</comment>
    <sql>ALTER TABLE record_drafts DROP CONSTRAINT IF EXISTS record_drafts_status_check;</sql>
    <sql>
      ALTER TABLE record_drafts
      ADD CONSTRAINT record_drafts_status_check
      CHECK (status IN ('PENDING', 'APPROVED', 'REJECTED', 'WITHDRAWN'));
    </sql>
  </changeSet>

  <changeSet id="0020-3-fix-exclusion-where" author="ordinis">
    <comment>Recreate exclusion WHERE clause to use 'PENDING' (matches enum serialization).</comment>
    <sql>ALTER TABLE record_drafts DROP CONSTRAINT IF EXISTS record_drafts_one_pending_per_key;</sql>
    <sql>
      ALTER TABLE record_drafts
      ADD CONSTRAINT record_drafts_one_pending_per_key
      EXCLUDE USING btree (
        dictionary_id WITH =,
        business_key WITH =
      ) WHERE (status = 'PENDING');
    </sql>
  </changeSet>

</databaseChangeLog>
