-- +goose Up
-- +goose StatementBegin

-- =========================================
-- ENUM: complaint_status - Статусы жалобы
-- =========================================
CREATE TYPE complaint_status AS ENUM (
    'pending',      -- Ожидает рассмотрения
    'in_review',    -- На рассмотрении модератором
    'resolved',     -- Разрешена
    'rejected'      -- Отклонена
);

COMMENT ON TYPE complaint_status IS 'Статусы жизненного цикла жалобы';

-- =========================================
-- ENUM: complaint_type - Типы жалоб
-- =========================================
CREATE TYPE complaint_type AS ENUM (
    'inappropriate_behavior',  -- Неподобающее поведение
    'no_show',                 -- Не явился
    'fraud',                   -- Мошенничество
    'spam',                    -- Спам
    'other'                    -- Другое
);

COMMENT ON TYPE complaint_type IS 'Типы жалоб на пользователей';

-- =========================================
-- ТАБЛИЦА: complaints - Жалобы
-- =========================================
CREATE TABLE complaints (
    id BIGSERIAL PRIMARY KEY,

    -- Связи
    complainant_id BIGINT NOT NULL REFERENCES users(id),  -- Кто жалуется
    defendant_id BIGINT NOT NULL REFERENCES users(id),    -- На кого жалуются
    request_id BIGINT REFERENCES requests(id),            -- Связанная заявка (опционально)

    -- Содержание жалобы
    type complaint_type NOT NULL,
    title VARCHAR(255) NOT NULL,
    description TEXT NOT NULL,

    -- Статус и обработка
    status complaint_status DEFAULT 'pending',
    moderator_id BIGINT REFERENCES users(id),
    moderator_comment TEXT,
    resolved_at TIMESTAMP WITH TIME ZONE,

    -- Аудит
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

-- Комментарии
COMMENT ON TABLE complaints IS 'Жалобы пользователей друг на друга';
COMMENT ON COLUMN complaints.complainant_id IS 'Пользователь, подающий жалобу';
COMMENT ON COLUMN complaints.defendant_id IS 'Пользователь, на которого жалуются';

-- Индексы
CREATE INDEX idx_complaints_defendant_id ON complaints(defendant_id);
CREATE INDEX idx_complaints_complainant_id ON complaints(complainant_id);
CREATE INDEX idx_complaints_status ON complaints(status);
CREATE INDEX idx_complaints_type ON complaints(type);
CREATE INDEX idx_complaints_moderator_id ON complaints(moderator_id) WHERE moderator_id IS NOT NULL;

-- =========================================
-- ТАБЛИЦА: user_blocks - Блокировки пользователей
-- =========================================
CREATE TABLE user_blocks (
    id BIGSERIAL PRIMARY KEY,

    -- Связи
    user_id BIGINT NOT NULL REFERENCES users(id),
    blocked_by BIGINT NOT NULL REFERENCES users(id),
    complaint_id BIGINT REFERENCES complaints(id),  -- Связанная жалоба (опционально)

    -- Детали блокировки
    reason TEXT NOT NULL,
    blocked_until TIMESTAMP WITH TIME ZONE,  -- NULL = бессрочная блокировка

    -- Статус
    is_active BOOLEAN DEFAULT TRUE,

    -- Аудит
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    unblocked_at TIMESTAMP WITH TIME ZONE,
    unblocked_by BIGINT REFERENCES users(id)
);

-- Комментарии
COMMENT ON TABLE user_blocks IS 'Блокировки пользователей модераторами';
COMMENT ON COLUMN user_blocks.blocked_until IS 'Дата окончания блокировки (NULL = бессрочная)';
COMMENT ON COLUMN user_blocks.is_active IS 'Активна ли блокировка в данный момент';

-- Индексы
CREATE INDEX idx_user_blocks_user_id_active ON user_blocks(user_id, is_active) WHERE is_active = TRUE;
CREATE INDEX idx_user_blocks_blocked_by ON user_blocks(blocked_by);
CREATE INDEX idx_user_blocks_created_at ON user_blocks(created_at DESC);

-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DROP TABLE IF EXISTS user_blocks CASCADE;
DROP TABLE IF EXISTS complaints CASCADE;
DROP TYPE IF EXISTS complaint_type CASCADE;
DROP TYPE IF EXISTS complaint_status CASCADE;
-- +goose StatementEnd
