import { describe, expect, it } from 'vitest';
import { describeFingerprint, isRefusedLog, LOG_STATUS_VARIANTS, logStatusKind, restoreSwitchNote } from './log-details';

describe('logStatusKind', () => {
    it('traduit les trois statuts de la base', () => {
        expect(logStatusKind('success', null)).toBe('success');
        expect(logStatusKind('error', {})).toBe('error');
        expect(logStatusKind('dry_run', { nights_pushed: 3 })).toBe('dry_run');
    });

    it('affiche « Refusé » pour un refus, bien que la base dise `error`', () => {
        expect(logStatusKind('error', { refused: true, reason: 'Logement archivé' })).toBe('refused');
    });

    it('reconnaît un refus écrit avant le marqueur `refused` (seul `refus` porte le motif)', () => {
        expect(logStatusKind('error', { refus: 'Yield désactivé sur ce logement : push refusé.' })).toBe('refused');
    });

    it('ne prend jamais une panne pour un refus', () => {
        expect(logStatusKind('error', { refus: '' })).toBe('error');
        expect(logStatusKind('error', { refus: 42 })).toBe('error');
        expect(logStatusKind('error', { refused: 'true' })).toBe('error');
        expect(logStatusKind('error', { refused: false })).toBe('error');
        expect(logStatusKind('error', null)).toBe('error');
    });

    it('rend null pour un statut inconnu : l’écran affiche la valeur brute', () => {
        expect(logStatusKind('pending', null)).toBeNull();
    });

    it('donne au refus une variante distincte de l’erreur', () => {
        expect(LOG_STATUS_VARIANTS.refused).not.toBe(LOG_STATUS_VARIANTS.error);
    });
});

describe('isRefusedLog', () => {
    it('lit details.refused === true, ou l’ancien motif `refus` non vide', () => {
        expect(isRefusedLog({ refused: true })).toBe(true);
        expect(isRefusedLog({ refus: 'Logement archivé' })).toBe(true);
        expect(isRefusedLog({ refused: 1 })).toBe(false);
        expect(isRefusedLog({ refus: '   ' })).toBe(false);
        expect(isRefusedLog([true])).toBe(false);
        expect(isRefusedLog(undefined)).toBe(false);
    });
});

describe('restoreSwitchNote', () => {
    it('ne dit « éteint avant la restauration » que si le yield était allumé', () => {
        expect(restoreSwitchNote({ yield_disabled: true, yield_was_active: true })).toBe('switched_off');
        expect(restoreSwitchNote({ yield_disabled: true, yield_was_active: false })).toBe('already_off');
    });

    it('ne dit rien sur une ligne antérieure à l’extinction automatique', () => {
        expect(restoreSwitchNote({ nights_restored: 91 })).toBeNull();
        expect(restoreSwitchNote(null)).toBeNull();
    });
});

describe('describeFingerprint', () => {
    it('résume la forme d’une réponse illisible', () => {
        expect(describeFingerprint({ shape: 'unknown', prices_type: 'array', prices_keys: ['Surprise', '@attributes'] })).toBe(
            'unknown · Prices { Surprise, @attributes }',
        );
    });

    it('dit le type quand Prices n’est pas un nœud', () => {
        expect(describeFingerprint({ shape: 'unknown', prices_type: 'string', prices_keys: null })).toBe('unknown · Prices : string');
    });

    it('rend null sur une empreinte absente ou vide', () => {
        expect(describeFingerprint(undefined)).toBeNull();
        expect(describeFingerprint('texte')).toBeNull();
        expect(describeFingerprint({})).toBeNull();
    });
});
