-- ============================================================================
-- SQL запрос для обновления upload_description документа по claim_document_id
-- ============================================================================
-- Параметры:
--   $1 :: uuid  -- claim_document_id (ID документа из таблицы clpr_claim_documents)
--   $2 :: text  -- upload_description (новое описание документа)
-- ============================================================================

WITH 
-- Находим документ и извлекаем нужные данные
doc_info AS (
  SELECT 
    cd.id AS claim_document_id,
    cd.claim_id::text AS claim_id_text,
    cd.field_name,
    -- Извлекаем индекс i из field_name (например, uploads[0][0] -> 0)
    NULLIF((regexp_match(cd.field_name, 'uploads\[(\d+)\]'))[1], '')::int AS upload_index,
    c.id AS claim_uuid,
    c.payload
  FROM clpr_claim_documents cd
  JOIN clpr_claims c ON c.id::text = cd.claim_id::text
  WHERE cd.id = $1
  LIMIT 1
),

-- Обновляем payload: приоритет обновления в следующем порядке:
-- 1. payload.body['uploads_descriptions[i]'] (самый приоритетный)
-- 2. payload['uploads_descriptions[i]'] (если нет body)
-- 3. payload.edit_fields_parsed.uploads_descriptions[i] (массив, если нет плоских ключей)
updated_claim AS (
  UPDATE clpr_claims c
  SET 
    payload = CASE
      -- Если есть payload.body, обновляем там
      WHEN c.payload->'body' IS NOT NULL THEN
        jsonb_set(
          c.payload,
          ARRAY['body', 'uploads_descriptions[' || di.upload_index::text || ']'],
          to_jsonb($2::text),
          true
        )
      -- Если нет body, но есть корневой ключ, обновляем там
      WHEN c.payload ? ('uploads_descriptions[' || di.upload_index::text || ']') THEN
        jsonb_set(
          c.payload,
          ARRAY['uploads_descriptions[' || di.upload_index::text || ']'],
          to_jsonb($2::text),
          true
        )
      -- Если есть edit_fields_parsed.uploads_descriptions (массив), обновляем там
      WHEN c.payload->'edit_fields_parsed'->'uploads_descriptions' IS NOT NULL 
        AND jsonb_typeof(c.payload->'edit_fields_parsed'->'uploads_descriptions') = 'array' THEN
        -- Для массива используем jsonb_set с числовым индексом
        jsonb_set(
          c.payload,
          ARRAY['edit_fields_parsed', 'uploads_descriptions', di.upload_index::text],
          to_jsonb($2::text),
          true
        )
      -- Если ничего нет, создаём в body
      ELSE
        jsonb_set(
          COALESCE(c.payload, '{}'::jsonb),
          ARRAY['body', 'uploads_descriptions[' || di.upload_index::text || ']'],
          to_jsonb($2::text),
          true
        )
    END,
    updated_at = now()
  FROM doc_info di
  WHERE c.id = di.claim_uuid
  RETURNING c.id, c.payload
)

-- Возвращаем обновлённые данные
SELECT 
  di.claim_document_id,
  di.claim_id_text AS claim_id,
  di.field_name,
  di.upload_index,
  -- Проверяем, где сохранилось описание
  COALESCE(
    uc.payload->'body'->>('uploads_descriptions[' || di.upload_index::text || ']'),
    uc.payload->>('uploads_descriptions[' || di.upload_index::text || ']'),
    uc.payload->'edit_fields_parsed'->'uploads_descriptions'->>di.upload_index::text,
    NULL
  ) AS upload_description,
  uc.payload
FROM doc_info di
JOIN updated_claim uc ON uc.id = di.claim_uuid;

