-- +goose Up
-- +goose StatementBegin

-- =========================================
-- НАЧАЛЬНЫЕ ДАННЫЕ: Роли
-- =========================================
INSERT INTO roles (name, description) VALUES
    ('requester', 'Маломобильный гражданин - может создавать заявки на помощь'),
    ('volunteer', 'Волонтёр - может откликаться на заявки и оказывать помощь'),
    ('moderator', 'Модератор - управляет системой, модерирует заявки и жалобы'),
    ('admin', 'Администратор - полный доступ ко всем функциям системы')
ON CONFLICT (name) DO NOTHING;

-- =========================================
-- НАЧАЛЬНЫЕ ДАННЫЕ: Разрешения
-- =========================================

-- Разрешения для заявок
INSERT INTO permissions (name, resource, action, description) VALUES
    ('request.create', 'request', 'create', 'Создание заявок на помощь'),
    ('request.read', 'request', 'read', 'Просмотр заявок'),
    ('request.read_all', 'request', 'read', 'Просмотр всех заявок (включая чужие)'),
    ('request.update_own', 'request', 'update', 'Редактирование своих заявок'),
    ('request.delete_own', 'request', 'delete', 'Удаление своих заявок'),
    ('request.moderate', 'request', 'moderate', 'Модерация заявок (одобрение/отклонение)'),
    ('request.delete_any', 'request', 'delete', 'Удаление любых заявок')
ON CONFLICT (name) DO NOTHING;

-- Разрешения для откликов волонтёров
INSERT INTO permissions (name, resource, action, description) VALUES
    ('volunteer_response.create', 'volunteer_response', 'create', 'Отклик на заявки'),
    ('volunteer_response.read', 'volunteer_response', 'read', 'Просмотр откликов'),
    ('volunteer_response.cancel', 'volunteer_response', 'delete', 'Отмена своего отклика')
ON CONFLICT (name) DO NOTHING;

-- Разрешения для рейтингов
INSERT INTO permissions (name, resource, action, description) VALUES
    ('rating.create', 'rating', 'create', 'Оставление рейтинга волонтёру'),
    ('rating.read', 'rating', 'read', 'Просмотр рейтингов'),
    ('rating.read_all', 'rating', 'read', 'Просмотр всех рейтингов')
ON CONFLICT (name) DO NOTHING;

-- Разрешения для жалоб
INSERT INTO permissions (name, resource, action, description) VALUES
    ('complaint.create', 'complaint', 'create', 'Подача жалобы на пользователя'),
    ('complaint.read_own', 'complaint', 'read', 'Просмотр своих жалоб'),
    ('complaint.moderate', 'complaint', 'moderate', 'Обработка жалоб модератором'),
    ('complaint.read_all', 'complaint', 'read', 'Просмотр всех жалоб')
ON CONFLICT (name) DO NOTHING;

-- Разрешения для пользователей
INSERT INTO permissions (name, resource, action, description) VALUES
    ('user.read_own', 'user', 'read', 'Просмотр своего профиля'),
    ('user.update_own', 'user', 'update', 'Редактирование своего профиля'),
    ('user.read_all', 'user', 'read', 'Просмотр всех пользователей'),
    ('user.block', 'user', 'block', 'Блокировка пользователей'),
    ('user.unblock', 'user', 'unblock', 'Разблокировка пользователей')
ON CONFLICT (name) DO NOTHING;

-- Разрешения для модераторских функций
INSERT INTO permissions (name, resource, action, description) VALUES
    ('moderator.view_logs', 'moderator_action', 'read', 'Просмотр логов модераторов'),
    ('moderator.view_statistics', 'statistics', 'read', 'Просмотр статистики системы')
ON CONFLICT (name) DO NOTHING;

-- =========================================
-- СВЯЗИ: Роли и Разрешения
-- =========================================

-- Разрешения для роли "requester" (маломобильный гражданин)
INSERT INTO role_permissions (role_id, permission_id)
SELECT
    (SELECT id FROM roles WHERE name = 'requester'),
    p.id
FROM permissions p
WHERE p.name IN (
    'request.create',
    'request.read',
    'request.update_own',
    'request.delete_own',
    'rating.create',
    'rating.read',
    'complaint.create',
    'complaint.read_own',
    'user.read_own',
    'user.update_own'
)
ON CONFLICT DO NOTHING;

-- Разрешения для роли "volunteer" (волонтёр)
INSERT INTO role_permissions (role_id, permission_id)
SELECT
    (SELECT id FROM roles WHERE name = 'volunteer'),
    p.id
FROM permissions p
WHERE p.name IN (
    'request.read',
    'volunteer_response.create',
    'volunteer_response.read',
    'volunteer_response.cancel',
    'rating.read',
    'complaint.create',
    'complaint.read_own',
    'user.read_own',
    'user.update_own'
)
ON CONFLICT DO NOTHING;

-- Разрешения для роли "moderator" (модератор)
INSERT INTO role_permissions (role_id, permission_id)
SELECT
    (SELECT id FROM roles WHERE name = 'moderator'),
    p.id
FROM permissions p
WHERE p.name IN (
    'request.read_all',
    'request.moderate',
    'request.delete_any',
    'volunteer_response.read',
    'rating.read_all',
    'complaint.moderate',
    'complaint.read_all',
    'user.read_all',
    'user.block',
    'user.unblock',
    'moderator.view_logs',
    'moderator.view_statistics'
)
ON CONFLICT DO NOTHING;

-- Разрешения для роли "admin" (администратор) - все разрешения
INSERT INTO role_permissions (role_id, permission_id)
SELECT
    (SELECT id FROM roles WHERE name = 'admin'),
    p.id
FROM permissions p
ON CONFLICT DO NOTHING;

-- =========================================
-- НАЧАЛЬНЫЕ ДАННЫЕ: Типы заявок
-- =========================================
INSERT INTO request_types (name, description, icon, is_active) VALUES
    ('groceries', 'Покупка продуктов питания', 'shopping-cart', TRUE),
    ('medicine', 'Покупка медикаментов и средств гигиены', 'medical', TRUE),
    ('tech_help', 'Помощь с техникой и электроникой', 'laptop', TRUE),
    ('household', 'Помощь по хозяйству', 'home', TRUE),
    ('documents', 'Помощь с документами', 'file-text', TRUE),
    ('other', 'Другая помощь', 'help-circle', TRUE)
ON CONFLICT (name) DO NOTHING;

-- =========================================
-- ВЫВОД ИНФОРМАЦИИ О СОЗДАННЫХ ДАННЫХ
-- =========================================
DO $$
DECLARE
    roles_count INTEGER;
    permissions_count INTEGER;
    role_permissions_count INTEGER;
    request_types_count INTEGER;
BEGIN
    SELECT COUNT(*) INTO roles_count FROM roles;
    SELECT COUNT(*) INTO permissions_count FROM permissions;
    SELECT COUNT(*) INTO role_permissions_count FROM role_permissions;
    SELECT COUNT(*) INTO request_types_count FROM request_types;

    RAISE NOTICE '===========================================';
    RAISE NOTICE 'Начальные данные успешно загружены:';
    RAISE NOTICE '===========================================';
    RAISE NOTICE 'Ролей: %', roles_count;
    RAISE NOTICE 'Разрешений: %', permissions_count;
    RAISE NOTICE 'Связей роли-разрешения: %', role_permissions_count;
    RAISE NOTICE 'Типов заявок: %', request_types_count;
    RAISE NOTICE '===========================================';
END $$;

-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin

-- Удаляем начальные данные (в обратном порядке из-за внешних ключей)
DELETE FROM role_permissions;
DELETE FROM request_types;
DELETE FROM permissions;
DELETE FROM roles;

-- +goose StatementEnd
