/**
 * Tests unitaires pour la synchronisation Jira
 */

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

describe('Synchronisation Jira - Logique de préservation des champs', () => {
  describe('buildSyncUpdateData pour Jira', () => {
    it('devrait préserver title si modifié localement', () => {
      const existingTask = {
        title: 'Titre modifié localement',
        description: 'Description locale',
        status: 'todo',
        priority: 'high',
        dueDate: new Date('2024-01-01'),
      };

      const syncData = {
        title: 'Titre original Jira',
        description: 'Description Jira',
        status: 'in_progress',
        priority: 'medium',
        dueDate: new Date('2024-01-02'),
      };

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

      expect(result.title).toBe('Titre modifié localement');
      expect(result.description).toBe('Description Jira'); // Écrasé
      expect(result.status).toBe('in_progress'); // Écrasé
      expect(result.priority).toBe('high'); // Préservé
      expect(result.dueDate).toEqual(new Date('2024-01-02')); // Écrasé
    });

    it('devrait préserver priority si modifié localement', () => {
      const existingTask = {
        title: 'Même titre',
        description: 'Description locale',
        status: 'todo',
        priority: 'low', // Modifié localement
        dueDate: new Date('2024-01-01'),
      };

      const syncData = {
        title: 'Même titre',
        description: 'Description Jira',
        status: 'done',
        priority: 'high', // Valeur Jira
        dueDate: null,
      };

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

      expect(result.priority).toBe('low'); // Préservé car modifié localement
    });

    it('devrait préserver status archived même si Jira dit done', () => {
      const existingTask = {
        title: 'Tâche archivée',
        description: 'Description',
        status: 'archived', // Archivé localement
        priority: 'medium',
        dueDate: null,
      };

      const syncData = {
        title: 'Tâche archivée',
        description: 'Description Jira',
        status: 'done', // Jira dit done
        priority: 'medium',
        dueDate: null,
      };

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

      expect(result.status).toBe('archived'); // Préservé car archived
    });

    it('devrait écraser status si pas archived', () => {
      const existingTask = {
        title: 'Tâche',
        description: 'Description',
        status: 'todo',
        priority: 'medium',
        dueDate: null,
      };

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

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

      expect(result.status).toBe('in_progress'); // Écrasé
    });

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

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

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

      expect(result.description).toBe('Description Jira'); // Toujours écrasé
    });

    it('devrait toujours écraser dueDate', () => {
      const existingTask = {
        title: 'Tâche',
        description: 'Description',
        status: 'todo',
        priority: 'medium',
        dueDate: new Date('2024-01-01'), // Date locale
      };

      const syncData = {
        title: 'Tâche',
        description: 'Description',
        status: 'todo',
        priority: 'medium',
        dueDate: new Date('2024-12-31'), // Date Jira
      };

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

      expect(result.dueDate).toEqual(new Date('2024-12-31')); // Toujours écrasé
    });

    it('devrait préserver priority même si title identique', () => {
      const existingTask = {
        title: 'Titre identique',
        description: 'Description locale',
        status: 'todo',
        priority: 'medium', // Modifié localement
        dueDate: null,
      };

      const syncData = {
        title: 'Titre identique', // Même titre
        description: 'Description Jira',
        status: 'done',
        priority: 'high', // Valeur Jira différente
        dueDate: new Date('2024-01-01'),
      };

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

      // Title identique → utilise syncData
      expect(result.title).toBe('Titre identique');
      // Priority différente → préservée même si title identique
      expect(result.priority).toBe('medium'); // Préservé car modifié localement
    });
  });
});
