-- +goose Up
-- +goose StatementBegin

-- =========================================
-- КРИТИЧЕСКИЕ GIST ИНДЕКСЫ ДЛЯ ГЕОПОИСКА
-- =========================================

-- GIST индекс для геолокации пользователей (волонтёров)
-- Используется для поиска волонтёров рядом с заявкой
CREATE INDEX idx_users_location_gist ON users USING GIST(location)
WHERE location IS NOT NULL AND deleted_at IS NULL;

-- GIST индекс для геолокации заявок
-- Используется для поиска заявок рядом с волонтёром
CREATE INDEX idx_requests_location_gist ON requests USING GIST(location)
WHERE deleted_at IS NULL;

-- Составной GIST индекс для геолокации + статус заявки
-- Критично для алгоритма матчинга: поиск только одобренных заявок рядом
CREATE INDEX idx_requests_location_status_gist ON requests USING GIST(location)
WHERE status = 'approved' AND deleted_at IS NULL;

-- GIST индекс для геолокации активных заявок
-- Используется для поиска заявок, готовых к выполнению
CREATE INDEX idx_requests_location_active_gist ON requests USING GIST(location)
WHERE status IN ('approved', 'in_progress') AND deleted_at IS NULL;

COMMENT ON INDEX idx_users_location_gist IS 'GIST индекс для быстрого геопоиска волонтёров';
COMMENT ON INDEX idx_requests_location_gist IS 'GIST индекс для быстрого геопоиска всех заявок';
COMMENT ON INDEX idx_requests_location_status_gist IS 'GIST индекс для поиска одобренных заявок (алгоритм матчинга)';
COMMENT ON INDEX idx_requests_location_active_gist IS 'GIST индекс для поиска активных заявок';

-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin

DROP INDEX IF EXISTS idx_requests_location_active_gist;
DROP INDEX IF EXISTS idx_requests_location_status_gist;
DROP INDEX IF EXISTS idx_requests_location_gist;
DROP INDEX IF EXISTS idx_users_location_gist;

-- +goose StatementEnd
