-- ============================================================================
-- SQL миграция: Добавление флага подтверждения данных контакта
-- ============================================================================
-- Назначение: Предотвратить изменение данных контакта после первого подтверждения
-- 
-- Логика:
-- 1. При первом подтверждении формы ставим contact_data_confirmed_at = NOW()
-- 2. Если данные уже есть в CRM (созданы менеджером) - считаем подтверждёнными
-- 3. При следующих обращениях проверяем флаг и блокируем редактирование
-- 4. При изменении данных обновляем timestamp
-- ============================================================================

-- 1. Добавляем поле contact_data_confirmed_at в clpr_users
ALTER TABLE clpr_users 
ADD COLUMN IF NOT EXISTS contact_data_confirmed_at TIMESTAMPTZ;

-- 2. Создаём индекс для быстрого поиска
CREATE INDEX IF NOT EXISTS idx_clpr_users_contact_data_confirmed 
ON clpr_users(contact_data_confirmed_at) 
WHERE contact_data_confirmed_at IS NOT NULL;

-- 3. Комментарий к полю
COMMENT ON COLUMN clpr_users.contact_data_confirmed_at IS 
'Дата и время подтверждения данных контакта пользователем. Если NULL - данные можно редактировать. Если NOT NULL - данные только для чтения.';

-- ============================================================================
-- Функция: Проверка, подтверждены ли данные контакта
-- ============================================================================
CREATE OR REPLACE FUNCTION clpr_is_contact_data_confirmed(p_unified_id VARCHAR)
RETURNS BOOLEAN AS $$
BEGIN
  RETURN EXISTS (
    SELECT 1 
    FROM clpr_users 
    WHERE unified_id = p_unified_id 
      AND contact_data_confirmed_at IS NOT NULL
  );
END;
$$ LANGUAGE plpgsql;

-- ============================================================================
-- Функция: Установить флаг подтверждения данных
-- ============================================================================
CREATE OR REPLACE FUNCTION clpr_set_contact_data_confirmed(
  p_unified_id VARCHAR,
  p_confirmed_at TIMESTAMPTZ DEFAULT NOW()
)
RETURNS VOID AS $$
BEGIN
  UPDATE clpr_users
  SET contact_data_confirmed_at = p_confirmed_at,
      updated_at = NOW()
  WHERE unified_id = p_unified_id;
  
  -- Если пользователь не найден - создаём запись (на всякий случай)
  IF NOT FOUND THEN
    INSERT INTO clpr_users (unified_id, contact_data_confirmed_at, created_at, updated_at)
    VALUES (p_unified_id, p_confirmed_at, NOW(), NOW())
    ON CONFLICT (unified_id) DO UPDATE
    SET contact_data_confirmed_at = p_confirmed_at,
        updated_at = NOW();
  END IF;
END;
$$ LANGUAGE plpgsql;

-- ============================================================================
-- Функция: Проверка и автоматическая установка флага для существующих контактов
-- ============================================================================
-- Если в CRM уже есть данные контакта (firstname, lastname, inn и т.д. заполнены),
-- считаем их подтверждёнными автоматически
-- 
-- ВАЖНО: Эта функция должна вызываться после синхронизации данных из CRM
-- ============================================================================
CREATE OR REPLACE FUNCTION clpr_auto_confirm_if_crm_has_data(
  p_unified_id VARCHAR,
  p_contact_id INTEGER
)
RETURNS VOID AS $$
DECLARE
  v_has_data BOOLEAN;
BEGIN
  -- Проверяем, есть ли уже подтверждённые данные
  IF EXISTS (
    SELECT 1 FROM clpr_users 
    WHERE unified_id = p_unified_id 
      AND contact_data_confirmed_at IS NOT NULL
  ) THEN
    RETURN; -- Уже подтверждено
  END IF;
  
  -- Проверяем наличие данных в CRM через webservice
  -- Если contact_id передан и > 0, считаем что данные есть в CRM
  -- (это упрощённая проверка, можно расширить через API)
  IF p_contact_id IS NOT NULL AND p_contact_id > 0 THEN
    -- Устанавливаем флаг подтверждения
    PERFORM clpr_set_contact_data_confirmed(p_unified_id);
  END IF;
END;
$$ LANGUAGE plpgsql;

-- ============================================================================
-- Функция: Получить статус подтверждения данных
-- ============================================================================
CREATE OR REPLACE FUNCTION clpr_get_contact_data_status(p_unified_id VARCHAR)
RETURNS TABLE(
  is_confirmed BOOLEAN,
  confirmed_at TIMESTAMPTZ,
  can_edit BOOLEAN
) AS $$
BEGIN
  RETURN QUERY
  SELECT 
    COALESCE(u.contact_data_confirmed_at IS NOT NULL, false) AS is_confirmed,
    u.contact_data_confirmed_at AS confirmed_at,
    COALESCE(u.contact_data_confirmed_at IS NULL, true) AS can_edit
  FROM clpr_users u
  WHERE u.unified_id = p_unified_id;
  
  -- Если пользователь не найден - возвращаем false (можно редактировать)
  IF NOT FOUND THEN
    RETURN QUERY SELECT false, NULL::TIMESTAMPTZ, true;
  END IF;
END;
$$ LANGUAGE plpgsql;

-- ============================================================================
-- Примеры использования:
-- ============================================================================

-- 1. Проверить, подтверждены ли данные
-- SELECT clpr_is_contact_data_confirmed('usr_abc123...');

-- 2. Установить флаг подтверждения
-- SELECT clpr_set_contact_data_confirmed('usr_abc123...');

-- 3. Получить статус
-- SELECT * FROM clpr_get_contact_data_status('usr_abc123...');

-- 4. Автоматически подтвердить, если данные есть в CRM
-- SELECT clpr_auto_confirm_if_crm_has_data('usr_abc123...', 396625);

