#include "./lib.sql"

#define mock__user_id 380055934
#define mock__password password
#define mock__request_claims __string({"sub": __ident(mock__user_id)})

BEGIN;
  DO $$
  DECLARE
    test_token TEXT;
  BEGIN
    SELECT public_api.token(__string(mock__user_id), __string(mock__password)) INTO test_token;
    
    IF test_token IS NULL THEN
      RAISE EXCEPTION 'Тест public_api.token: Токен не должен быть NULL';
    END IF;
    
    IF array_length(string_to_array(test_token, '.'), 1) != 3 THEN
      RAISE EXCEPTION 'Тест public_api.token: Токен не соответствует формату JWT (должен состоять из трех частей, разделенных точками)';
    END IF;
    
    RAISE NOTICE 'Тест public_api.token успешно пройден. Получен токен: %', test_token;
  EXCEPTION
    WHEN OTHERS THEN
      RAISE NOTICE 'Тест public_api.token завершился с ошибкой: %', SQLERRM;
  END;
  $$;
ROLLBACK;

BEGIN;
  SET LOCAL app.request_claims = mock__request_claims;
  
  DO $$
  DECLARE
    pool_balance JSONB;
  BEGIN
    PERFORM set_config('request.jwt.claims', current_setting('app.request_claims'), true);
    
    BEGIN
      SELECT public_api.balance('residential') INTO pool_balance;
      
      IF pool_balance IS NULL THEN
        RAISE EXCEPTION 'Тест public_api.balance: Результат не должен быть NULL';
      END IF;
      
      RAISE NOTICE 'Тест public_api.balance успешно пройден. Получен баланс: %', pool_balance;
    EXCEPTION
      WHEN OTHERS THEN
        RAISE NOTICE 'Тест public_api.balance: %', SQLERRM;
    END;
  END;
  $$;
ROLLBACK;

-- Тест функции countries
BEGIN;
  SET LOCAL app.request_claims = mock__request_claims;
  
  DO $$
  DECLARE
    countries_result JSONB;
  BEGIN
    PERFORM set_config('request.jwt.claims', current_setting('app.request_claims'), true);
    
    BEGIN
      SELECT public_api.countries('residential') INTO countries_result;
      
      IF countries_result IS NULL THEN
        RAISE EXCEPTION 'Тест public_api.countries: Результат не должен быть NULL';
      END IF;
      
      RAISE NOTICE 'Тест public_api.countries успешно пройден. Получен результат: %', countries_result;
    EXCEPTION
      WHEN OTHERS THEN
        RAISE NOTICE 'Тест public_api.countries: %', SQLERRM;
    END;
  END;
  $$;
ROLLBACK;

-- Тест функции states
BEGIN;
  SET LOCAL app.request_claims = mock__request_claims;
  
  DO $$
  DECLARE
    states_result JSONB;
  BEGIN
    PERFORM set_config('request.jwt.claims', current_setting('app.request_claims'), true);
    
    BEGIN
      SELECT public_api.states('residential', ARRAY['US']) INTO states_result;
      
      IF states_result IS NULL THEN
        RAISE EXCEPTION 'Тест public_api.states: Результат не должен быть NULL';
      END IF;
      
      RAISE NOTICE 'Тест public_api.states успешно пройден. Получен результат: %', states_result;
    EXCEPTION
      WHEN OTHERS THEN
        RAISE NOTICE 'Тест public_api.states: %', SQLERRM;
    END;
  END;
  $$;
ROLLBACK;

-- Тест функции cities
BEGIN;
  SET LOCAL app.request_claims = mock__request_claims;
  
  DO $$
  DECLARE
    cities_result JSONB;
  BEGIN
    PERFORM set_config('request.jwt.claims', current_setting('app.request_claims'), true);
    
    BEGIN
      SELECT public_api.cities('residential', ARRAY['US'], NULL, NULL) INTO cities_result;
      
      IF cities_result IS NULL THEN
        RAISE EXCEPTION 'Тест public_api.cities: Результат не должен быть NULL';
      END IF;
      
      RAISE NOTICE 'Тест public_api.cities успешно пройден. Получен результат: %', cities_result;
    EXCEPTION
      WHEN OTHERS THEN
        RAISE NOTICE 'Тест public_api.cities: %', SQLERRM;
    END;
  END;
  $$;
ROLLBACK;

-- Тест функции asns
BEGIN;
  SET LOCAL app.request_claims = mock__request_claims;
  
  DO $$
  DECLARE
    asns_result JSONB;
  BEGIN
    PERFORM set_config('request.jwt.claims', current_setting('app.request_claims'), true);
    
    BEGIN
      SELECT public_api.asns('residential', ARRAY['US'], NULL, NULL) INTO asns_result;
      
      IF asns_result IS NULL THEN
        RAISE EXCEPTION 'Тест public_api.asns: Результат не должен быть NULL';
      END IF;
      
      RAISE NOTICE 'Тест public_api.asns успешно пройден. Получен результат: %', asns_result;
    EXCEPTION
      WHEN OTHERS THEN
        RAISE NOTICE 'Тест public_api.asns: %', SQLERRM;
    END;
  END;
  $$;
ROLLBACK;

-- Тест функции zipcodes
BEGIN;
  SET LOCAL app.request_claims = mock__request_claims;
  
  DO $$
  DECLARE
    zipcodes_result JSONB;
  BEGIN
    PERFORM set_config('request.jwt.claims', current_setting('app.request_claims'), true);
    
    BEGIN
      SELECT public_api.zipcodes('residential', ARRAY['US'], NULL) INTO zipcodes_result;
      
      IF zipcodes_result IS NULL THEN
        RAISE EXCEPTION 'Тест public_api.zipcodes: Результат не должен быть NULL';
      END IF;
      
      RAISE NOTICE 'Тест public_api.zipcodes успешно пройден. Получен результат: %', zipcodes_result;
    EXCEPTION
      WHEN OTHERS THEN
        RAISE NOTICE 'Тест public_api.zipcodes: %', SQLERRM;
    END;
  END;
  $$;
ROLLBACK;

-- Тест функции proxy
BEGIN;
  -- Имитируем JWT авторизацию, устанавливая request.jwt.claims
  SET LOCAL app.request_claims = mock__request_claims;
  
  DO $$
  DECLARE
    proxy_result TEXT;
  BEGIN
    -- Устанавливаем клеймы JWT для запроса
    PERFORM set_config('request.jwt.claims', current_setting('app.request_claims'), true);
    
    RAISE NOTICE 'mock__request_claims: %', mock__request_claims;
    
    -- Вызываем функцию proxy для генерации прокси для пула 'residential'
    BEGIN
      SELECT public_api.proxy(
        'residential',   -- pool
        'US',            -- countries
        NULL,            -- cities
        NULL,            -- states
        NULL,            -- asns
        NULL,            -- zipcodes
        'true',          -- anonymous
        'rotating',      -- type
        'http',          -- protocol
        'login:password@hostname:port',         -- format
        1,               -- quantity
        600              -- sessionttl
      ) INTO proxy_result;
      
      -- Проверяем, что результат не NULL
      IF proxy_result IS NULL THEN
        RAISE EXCEPTION 'Тест public_api.proxy: Результат не должен быть NULL';
      END IF;
      
      RAISE NOTICE 'Тест public_api.proxy успешно пройден. Получен результат: %', proxy_result;
    EXCEPTION
      WHEN OTHERS THEN
        -- Если тест упал из-за отсутствия пользователя с указанным sub в тестовой базе,
        -- считаем это допустимым для тестового сценария
        RAISE NOTICE 'Тест public_api.proxy: %', SQLERRM;
    END;
  END;
  $$;
ROLLBACK;