/**
 * SanctionsService — клиент для системы санкций и жалоб на баны.
 *
 * Storys-эндпоинты (через /api-storys):
 *   GET  /api/v1/storys/me/sanctions  → активные санкции юзера
 *
 * Team-эндпоинты (через /api-team):
 *   POST /api-team/ban-appeals                — подать жалобу
 *   GET  /api-team/ban-appeals/my             — мои жалобы
 *   GET  /api-team/ban-appeals/<id>           — детали + чат
 *   POST /api-team/ban-appeals/<id>/messages  — написать в чат
 */
import axios from 'axios';

const STORYS_BASE = '/api-storys';
const TEAM_BASE = '/api-team';

function authHeaders() {
    const t = localStorage.getItem('Authorization');
    return t ? { Authorization: t } : {};
}

class SanctionsService {
    /** Активные санкции текущего юзера. Возвращает {sanctions: [], has_active}. */
    static async getMySanctions() {
        try {
            const r = await axios.get(
                `${STORYS_BASE}/api/v1/storys/me/sanctions`,
                { headers: authHeaders(), timeout: 8000 },
            );
            return r.data || { sanctions: [], has_active: false };
        } catch (e) {
            return { sanctions: [], has_active: false, error: e?.message };
        }
    }

    /** Подать жалобу на бан. */
    static async submitAppeal({ banType, banId, banService, text, banSnapshot }) {
        try {
            const r = await axios.post(
                `${TEAM_BASE}/ban-appeals`,
                {
                    ban_type: banType,
                    ban_id: banId,
                    ban_service: banService || 'storys',
                    text,
                    ban_snapshot: banSnapshot || null,
                },
                { headers: { ...authHeaders(), 'Content-Type': 'application/json' } },
            );
            return { ok: true, ...r.data };
        } catch (e) {
            const d = e.response?.data || {};
            return {
                ok: false,
                error: d.error,
                appealId: d.appeal_id,
                status: d.status,
                message: d.error === 'already_submitted'
                    ? 'Вы уже подавали жалобу на этот бан.'
                    : d.error === 'invalid_text'
                        ? 'Введите текст жалобы (1-4000 символов).'
                        : 'Не удалось подать жалобу.',
            };
        }
    }

    /** Мои жалобы. */
    static async getMyAppeals() {
        try {
            const r = await axios.get(
                `${TEAM_BASE}/ban-appeals/my`,
                { headers: authHeaders() },
            );
            return r.data?.items || [];
        } catch (e) {
            return [];
        }
    }

    /** Детали жалобы + сообщения. */
    static async getAppeal(appealId) {
        try {
            const r = await axios.get(
                `${TEAM_BASE}/ban-appeals/${appealId}`,
                { headers: authHeaders() },
            );
            return { ok: true, ...r.data };
        } catch (e) {
            return { ok: false, error: e.response?.data?.error };
        }
    }

    /** Написать сообщение в жалобу. */
    static async sendMessage(appealId, text) {
        try {
            const r = await axios.post(
                `${TEAM_BASE}/ban-appeals/${appealId}/messages`,
                { text },
                { headers: { ...authHeaders(), 'Content-Type': 'application/json' } },
            );
            return { ok: true, ...r.data };
        } catch (e) {
            return { ok: false, error: e.response?.data?.error };
        }
    }
}

export default SanctionsService;
