import { describe, expect, it } from 'vitest';
import {
    findTemplateById, HK_SANCTION_TEMPLATES, HousekeepingSanctionType, templatesByType
} from './HousekeepingSanctionTemplates';

describe('HK_SANCTION_TEMPLATES', () =>
{
    it('has a unique id for every template', () =>
    {
        const ids = HK_SANCTION_TEMPLATES.map(t => t.id);
        const unique = new Set(ids);

        expect(unique.size).toBe(ids.length);
    });

    it('covers every sanction type at least once', () =>
    {
        const types = new Set(HK_SANCTION_TEMPLATES.map(t => t.type));

        expect(types.has(HousekeepingSanctionType.BAN)).toBe(true);
        expect(types.has(HousekeepingSanctionType.MUTE)).toBe(true);
        expect(types.has(HousekeepingSanctionType.KICK)).toBe(true);
        expect(types.has(HousekeepingSanctionType.TRADE_LOCK)).toBe(true);
    });

    it('uses durationValue=0 for KICK templates only (kick is instant, no duration)', () =>
    {
        for(const template of HK_SANCTION_TEMPLATES)
        {
            if(template.type === HousekeepingSanctionType.KICK) expect(template.durationValue).toBe(0);
            else expect(template.durationValue).toBeGreaterThan(0);
        }
    });

    it('every template has a non-empty default reason (avoids empty-reason validation failures)', () =>
    {
        for(const template of HK_SANCTION_TEMPLATES)
        {
            expect(template.defaultReason.trim().length).toBeGreaterThan(0);
        }
    });
});

describe('findTemplateById', () =>
{
    it('returns the matching template', () =>
    {
        expect(findTemplateById('ban_24h')?.type).toBe(HousekeepingSanctionType.BAN);
        expect(findTemplateById('ban_24h')?.durationValue).toBe(24);
    });

    it('returns null for an unknown id', () =>
    {
        expect(findTemplateById('does-not-exist')).toBeNull();
        expect(findTemplateById('')).toBeNull();
    });
});

describe('templatesByType', () =>
{
    it('filters the list down to a single type', () =>
    {
        const bans = templatesByType(HousekeepingSanctionType.BAN);

        expect(bans.length).toBeGreaterThan(0);
        expect(bans.every(t => t.type === HousekeepingSanctionType.BAN)).toBe(true);
    });

    it('returns an empty list for unknown types (defensive)', () =>
    {
        expect(templatesByType('unknown' as never)).toEqual([]);
    });
});
