import { describe, it, expect } from 'vitest';

/**
 * Tests de validation structurelle des imports.
 * Vérifie que les données importées sont conformes au schéma attendu.
 */

// Réplique de la logique de validation de ParametresView
function validateEnclosData(data: any): boolean {
  if (!data || typeof data !== 'object' || data === null) return false;
  if (!Array.isArray(data.enclos)) return false;
  return data.enclos.every((enc: any) =>
    enc && typeof enc === 'object' &&
    typeof enc.id === 'number' &&
    typeof enc.name === 'string' &&
    Array.isArray(enc.dragodindes) &&
    enc.gaugeLevels && typeof enc.gaugeLevels === 'object' &&
    enc.timer && typeof enc.timer === 'object',
  );
}

describe('Validation import — validateEnclosData', () => {
  it('accepte un state valide', () => {
    const data = {
      enclos: [{
        id: 1, name: 'Enclos 1',
        dragodindes: [],
        gaugeLevels: { baffeur: 0 },
        timer: { running: false },
      }],
    };
    expect(validateEnclosData(data)).toBe(true);
  });

  it('accepte un state avec plusieurs enclos', () => {
    const data = {
      enclos: [
        { id: 1, name: 'A', dragodindes: [], gaugeLevels: {}, timer: {} },
        { id: 2, name: 'B', dragodindes: [{ id: 1 }], gaugeLevels: {}, timer: {} },
      ],
    };
    expect(validateEnclosData(data)).toBe(true);
  });

  it('rejette null', () => {
    expect(validateEnclosData(null)).toBe(false);
  });

  it('rejette undefined', () => {
    expect(validateEnclosData(undefined)).toBe(false);
  });

  it('rejette une chaîne', () => {
    expect(validateEnclosData('hello')).toBe(false);
  });

  it('rejette un objet sans enclos', () => {
    expect(validateEnclosData({ foo: 'bar' })).toBe(false);
  });

  it('rejette enclos non-array', () => {
    expect(validateEnclosData({ enclos: 'not array' })).toBe(false);
  });

  it('rejette enclos avec id manquant', () => {
    const data = {
      enclos: [{ name: 'A', dragodindes: [], gaugeLevels: {}, timer: {} }],
    };
    expect(validateEnclosData(data)).toBe(false);
  });

  it('rejette enclos avec name non-string', () => {
    const data = {
      enclos: [{ id: 1, name: 123, dragodindes: [], gaugeLevels: {}, timer: {} }],
    };
    expect(validateEnclosData(data)).toBe(false);
  });

  it('rejette enclos sans dragodindes', () => {
    const data = {
      enclos: [{ id: 1, name: 'A', gaugeLevels: {}, timer: {} }],
    };
    expect(validateEnclosData(data)).toBe(false);
  });

  it('rejette enclos sans gaugeLevels', () => {
    const data = {
      enclos: [{ id: 1, name: 'A', dragodindes: [], timer: {} }],
    };
    expect(validateEnclosData(data)).toBe(false);
  });

  it('rejette enclos sans timer', () => {
    const data = {
      enclos: [{ id: 1, name: 'A', dragodindes: [], gaugeLevels: {} }],
    };
    expect(validateEnclosData(data)).toBe(false);
  });

  it('rejette si un seul enclos est invalide dans le tableau', () => {
    const data = {
      enclos: [
        { id: 1, name: 'A', dragodindes: [], gaugeLevels: {}, timer: {} },
        { id: 'bad' }, // invalide
      ],
    };
    expect(validateEnclosData(data)).toBe(false);
  });

  it('accepte un tableau enclos vide', () => {
    expect(validateEnclosData({ enclos: [] })).toBe(true);
  });

  it('rejette un objet backup avec data: null', () => {
    expect(validateEnclosData({ app: 'obsidienne', data: null })).toBe(false);
  });
});
