/**
 * Tests unitaires pour la synchronisation TFS
 */

import { describe, it, expect } from 'vitest';
import { buildSyncUpdateData } from '@/services/task-management/readonly-fields';

describe("Synchronisation TFS - Logique d'écrasement des champs", () => {
  describe('buildSyncUpdateData pour TFS', () => {
    it('devrait écraser tous les champs même si modifiés localement', () => {
      const existingTask = {
        title: 'Titre modifié localement',
        description: 'Description locale modifiée',
        status: 'todo',
        priority: 'high',
        dueDate: new Date('2024-01-01'),
      };

      const syncData = {
        title: 'PR: Nouvelle Pull Request',
        description: 'Description TFS',
        status: 'done',
        priority: 'medium',
        dueDate: null,
      };

      const result = buildSyncUpdateData('tfs', existingTask, syncData);

      // Tous les champs doivent être écrasés
      expect(result.title).toBe('PR: Nouvelle Pull Request');
      expect(result.description).toBe('Description TFS');
      expect(result.status).toBe('done');
      expect(result.priority).toBe('medium');
      expect(result.dueDate).toBeNull();
    });

    it('devrait écraser title même si différent', () => {
      const existingTask = {
        title: 'Ancien titre',
        description: 'Description',
        status: 'todo',
        priority: 'medium',
        dueDate: null,
      };

      const syncData = {
        title: 'PR: Nouveau titre',
        description: 'Description',
        status: 'todo',
        priority: 'medium',
        dueDate: null,
      };

      const result = buildSyncUpdateData('tfs', existingTask, syncData);

      expect(result.title).toBe('PR: Nouveau titre'); // Écrasé
    });

    it('devrait écraser priority même si modifié localement', () => {
      const existingTask = {
        title: 'PR: Tâche',
        description: 'Description',
        status: 'todo',
        priority: 'low', // Modifié localement
        dueDate: null,
      };

      const syncData = {
        title: 'PR: Tâche',
        description: 'Description',
        status: 'todo',
        priority: 'high', // Valeur TFS
        dueDate: null,
      };

      const result = buildSyncUpdateData('tfs', existingTask, syncData);

      expect(result.priority).toBe('high'); // Écrasé
    });

    it('devrait écraser status même si archived localement', () => {
      const existingTask = {
        title: 'PR: Tâche',
        description: 'Description',
        status: 'archived', // Archivé localement
        priority: 'medium',
        dueDate: null,
      };

      const syncData = {
        title: 'PR: Tâche',
        description: 'Description',
        status: 'done', // TFS dit done
        priority: 'medium',
        dueDate: null,
      };

      const result = buildSyncUpdateData('tfs', existingTask, syncData);

      expect(result.status).toBe('done'); // Écrasé même si archived
    });

    it('devrait écraser description même si modifiée localement', () => {
      const existingTask = {
        title: 'PR: Tâche',
        description: 'Description locale modifiée',
        status: 'todo',
        priority: 'medium',
        dueDate: null,
      };

      const syncData = {
        title: 'PR: Tâche',
        description: 'Description TFS',
        status: 'todo',
        priority: 'medium',
        dueDate: null,
      };

      const result = buildSyncUpdateData('tfs', existingTask, syncData);

      expect(result.description).toBe('Description TFS'); // Écrasé
    });

    it('devrait écraser dueDate même si défini localement', () => {
      const existingTask = {
        title: 'PR: Tâche',
        description: 'Description',
        status: 'todo',
        priority: 'medium',
        dueDate: new Date('2024-01-01'), // Date locale
      };

      const syncData = {
        title: 'PR: Tâche',
        description: 'Description',
        status: 'todo',
        priority: 'medium',
        dueDate: null, // TFS n'a pas de dueDate
      };

      const result = buildSyncUpdateData('tfs', existingTask, syncData);

      expect(result.dueDate).toBeNull(); // Écrasé
    });
  });
});
