/**
 * @license
 * Copyright 2026 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

import { describe, it, expect } from 'vitest';
import {
  getFileDiffFromResultDisplay,
  computeModelAddedAndRemovedLines,
} from './fileDiffUtils.js';
import type { FileDiff, ToolResultDisplay } from '../tools/tools.js';

describe('fileDiffUtils', () => {
  describe('getFileDiffFromResultDisplay', () => {
    it('returns undefined if resultDisplay is undefined', () => {
      expect(getFileDiffFromResultDisplay(undefined)).toBeUndefined();
    });

    it('returns undefined if resultDisplay is not an object', () => {
      expect(
        getFileDiffFromResultDisplay('string' as ToolResultDisplay),
      ).toBeUndefined();
    });

    it('returns undefined if resultDisplay missing diffStat', () => {
      const resultDisplay = {
        fileName: 'file.txt',
      };
      expect(
        getFileDiffFromResultDisplay(resultDisplay as ToolResultDisplay),
      ).toBeUndefined();
    });

    it('returns the FileDiff object if structure is valid', () => {
      const validDiffStat = {
        model_added_lines: 1,
        model_removed_lines: 2,
        user_added_lines: 3,
        user_removed_lines: 4,
        model_added_chars: 10,
        model_removed_chars: 20,
        user_added_chars: 30,
        user_removed_chars: 40,
      };
      const resultDisplay = {
        fileName: 'file.txt',
        diffStat: validDiffStat,
      };

      const result = getFileDiffFromResultDisplay(
        resultDisplay as ToolResultDisplay,
      );
      expect(result).toBe(resultDisplay);
    });
  });

  describe('computeAddedAndRemovedLines', () => {
    it('returns 0 added and 0 removed if stats is undefined', () => {
      expect(computeModelAddedAndRemovedLines(undefined)).toEqual({
        addedLines: 0,
        removedLines: 0,
      });
    });

    it('correctly sums added and removed lines from stats', () => {
      const stats: FileDiff['diffStat'] = {
        model_added_lines: 10,
        model_removed_lines: 5,
        user_added_lines: 2,
        user_removed_lines: 1,
        model_added_chars: 100,
        model_removed_chars: 50,
        user_added_chars: 20,
        user_removed_chars: 10,
      };

      const result = computeModelAddedAndRemovedLines(stats);
      expect(result).toEqual({
        addedLines: 10,
        removedLines: 5,
      });
    });

    it('handles zero values correctly', () => {
      const stats: FileDiff['diffStat'] = {
        model_added_lines: 0,
        model_removed_lines: 0,
        user_added_lines: 0,
        user_removed_lines: 0,
        model_added_chars: 0,
        model_removed_chars: 0,
        user_added_chars: 0,
        user_removed_chars: 0,
      };

      const result = computeModelAddedAndRemovedLines(stats);
      expect(result).toEqual({
        addedLines: 0,
        removedLines: 0,
      });
    });
  });
});
