-- ============================================================================
-- SQL запрос для получения данных контакта из CRM (через n8n)
-- ============================================================================
-- Назначение: Получить актуальные данные контакта из CRM для отображения
--             в форме подтверждения (если данные уже подтверждены)
-- 
-- Использование: В n8n workflow после проверки флага contact_data_confirmed_at
-- ============================================================================

-- ВАЖНО: Этот запрос выполняется через n8n HTTP Request к CRM webservice,
-- а не напрямую в PostgreSQL, т.к. CRM в MySQL

-- Пример запроса к CRM через n8n:
-- POST https://crm.clientright.ru/webservice.php
-- Body: operation=retrieve&sessionName={{sessionName}}&id=12x{{contact_id}}

-- ============================================================================
-- Альтернатива: Хранить кэш данных контакта в PostgreSQL
-- ============================================================================

-- Создаём таблицу для кэширования данных контакта из CRM
CREATE TABLE IF NOT EXISTS clpr_contact_data_cache (
  unified_id VARCHAR NOT NULL PRIMARY KEY,
  contact_id INTEGER,
  firstname VARCHAR,
  lastname VARCHAR,
  middle_name VARCHAR,
  inn VARCHAR,
  birthday DATE,
  birthplace VARCHAR,
  mailingstreet VARCHAR,
  email VARCHAR,
  mobile VARCHAR,
  -- Дополнительные поля из CRM
  data_json JSONB, -- Полные данные из CRM для расширяемости
  synced_at TIMESTAMPTZ DEFAULT NOW(),
  created_at TIMESTAMPTZ DEFAULT NOW(),
  updated_at TIMESTAMPTZ DEFAULT NOW(),
  
  CONSTRAINT fk_unified_id FOREIGN KEY (unified_id) 
    REFERENCES clpr_users(unified_id) ON DELETE CASCADE
);

-- Индекс для быстрого поиска
CREATE INDEX IF NOT EXISTS idx_clpr_contact_data_cache_contact_id 
ON clpr_contact_data_cache(contact_id);

-- Комментарий
COMMENT ON TABLE clpr_contact_data_cache IS 
'Кэш данных контакта из CRM. Обновляется при синхронизации через n8n.';

-- ============================================================================
-- Функция: Получить данные контакта (из кэша или NULL)
-- ============================================================================
CREATE OR REPLACE FUNCTION clpr_get_contact_data(p_unified_id VARCHAR)
RETURNS TABLE(
  contact_id INTEGER,
  firstname VARCHAR,
  lastname VARCHAR,
  middle_name VARCHAR,
  inn VARCHAR,
  birthday DATE,
  birthplace VARCHAR,
  mailingstreet VARCHAR,
  email VARCHAR,
  mobile VARCHAR,
  data_json JSONB
) AS $$
BEGIN
  RETURN QUERY
  SELECT 
    c.contact_id,
    c.firstname,
    c.lastname,
    c.middle_name,
    c.inn,
    c.birthday,
    c.birthplace,
    c.mailingstreet,
    c.email,
    c.mobile,
    c.data_json
  FROM clpr_contact_data_cache c
  WHERE c.unified_id = p_unified_id;
END;
$$ LANGUAGE plpgsql;

-- ============================================================================
-- Функция: Обновить кэш данных контакта
-- ============================================================================
CREATE OR REPLACE FUNCTION clpr_update_contact_data_cache(
  p_unified_id VARCHAR,
  p_contact_id INTEGER,
  p_data JSONB
)
RETURNS VOID AS $$
BEGIN
  INSERT INTO clpr_contact_data_cache (
    unified_id,
    contact_id,
    firstname,
    lastname,
    middle_name,
    inn,
    birthday,
    birthplace,
    mailingstreet,
    email,
    mobile,
    data_json,
    synced_at,
    updated_at
  ) VALUES (
    p_unified_id,
    p_contact_id,
    p_data->>'firstname',
    p_data->>'lastname',
    p_data->>'cf_1157', -- middle_name
    p_data->>'cf_1257', -- inn
    (p_data->>'birthday')::DATE,
    p_data->>'cf_1263', -- birthplace
    p_data->>'mailingstreet',
    p_data->>'email',
    p_data->>'mobile',
    p_data,
    NOW(),
    NOW()
  )
  ON CONFLICT (unified_id) DO UPDATE
  SET 
    contact_id = EXCLUDED.contact_id,
    firstname = EXCLUDED.firstname,
    lastname = EXCLUDED.lastname,
    middle_name = EXCLUDED.middle_name,
    inn = EXCLUDED.inn,
    birthday = EXCLUDED.birthday,
    birthplace = EXCLUDED.birthplace,
    mailingstreet = EXCLUDED.mailingstreet,
    email = EXCLUDED.email,
    mobile = EXCLUDED.mobile,
    data_json = EXCLUDED.data_json,
    synced_at = NOW(),
    updated_at = NOW();
END;
$$ LANGUAGE plpgsql;

