import { describe, it, expect, vi } from 'vitest';
import { validateMatrixCheckbox } from '../validateMatrixCheckbox';
import { getLanguage } from '@/views/Survey/views/Preview/js/language';
import type { ITranslatedText } from '@/views/Survey/views/Preview/components/questions/types/translatedText';

// 模拟翻译函数
const mockTranslatedText: ITranslatedText = getLanguage(['zh']);

describe('validateMatrixCheckbox 函数测试', () => {
  // 基础测试数据
  const baseOptions = [
    {
      type: 1, // 行选项
      options: [
        { option_key: 'row1', option: '行1' },
        { option_key: 'row2', option: '行2' },
        { option_key: 'row3', option: '行3' }
      ],
      cite_type: 0,
      relation_type: 0,
      relation_out_scope: [],
      relation_last_scope: 0,
      relation_first_scope: 0,
      relation_question_index: 0
    },
    {
      type: 2, // 列选项
      options: [
        { option_key: 'col1', option: '列1' },
        { option_key: 'col2', option: '列2' },
        { option_key: 'col3', option: '列3' }
      ],
      cite_type: 0,
      relation_type: 0,
      relation_out_scope: [],
      relation_last_scope: 0,
      relation_first_scope: 0,
      relation_question_index: 0
    }
  ];

  const baseConfig = {
    is_required: 1,
    quick_type: 0,
    each_number: 3,
    max_select: 3,
    min_select: 1,
    select_random: 0,
    is_change_row_cell: false,
    float_window_content: '',
    is_show: [],
    is_brand: 0,
    is_behavior: 0,
    is_initialize: 0,
    is_price_tag: 0,
    is_three_dimensions: 0,
    is_default_perspective: 0,
    popup_window: 0,
    popup_window_content: ''
  };

  it('当选项为空数组时，应返回空字符串', () => {
    const answer = [];
    const result = validateMatrixCheckbox(answer, baseConfig, [], mockTranslatedText);
    expect(result).toBe('');
  });

  it('当所有行都满足最小选择数要求时，应返回空字符串', () => {
    const answer = [
      [1], // 第1行选择了1个
      [1, 2], // 第2行选择了2个
      [1, 2, 3] // 第3行选择了3个
    ];
    const result = validateMatrixCheckbox(answer, baseConfig, baseOptions, mockTranslatedText);
    expect(result).toBe('');
  });

  it('当某行选择数小于最小要求时，应返回相应错误信息', () => {
    const answer = [
      [1], // 第1行选择了1个
      [], // 第2行没有选择
      [1, 2] // 第3行选择了2个
    ];
    const result = validateMatrixCheckbox(answer, baseConfig, baseOptions, mockTranslatedText);
    expect(result).toBe('第2行最少选1个。');
  });

  it('当某行选择数超过最大要求时，应返回相应错误信息', () => {
    const config = { ...baseConfig, max_select: 2 };
    const answer = [
      [1], // 第1行选择了1个
      [1, 2], // 第2行选择了2个
      [1, 2, 3] // 第3行选择了3个，超过了最大值2
    ];
    const result = validateMatrixCheckbox(answer, config, baseOptions, mockTranslatedText);
    expect(result).toBe('第3行最多选2个。');
  });

  it('当设置is_change_row_cell=true时，应返回列相关的错误信息', () => {
    const config = { ...baseConfig, is_change_row_cell: true };
    const answer = [
      [1], // 第1行选择了1个
      [], // 第2行没有选择
      [1, 2] // 第3行选择了2个
    ];
    const result = validateMatrixCheckbox(answer, config, baseOptions, mockTranslatedText);
    expect(result).toBe('第2列最少选1个。');
  });

  it('当min_select为0时，不应进行最小值校验', () => {
    const config = { ...baseConfig, min_select: 0 };
    const answer = [
      [], // 第1行没有选择
      [], // 第2行没有选择
      [] // 第3行没有选择
    ];
    const result = validateMatrixCheckbox(answer, config, baseOptions, mockTranslatedText);
    expect(result).toBe('');
  });

  it('当min_select为空字符串时，应将其转换为0并且不进行最小值校验', () => {
    const config = { ...baseConfig, min_select: '' as any };
    const answer = [
      [], // 第1行没有选择
      [], // 第2行没有选择
      [] // 第3行没有选择
    ];
    const result = validateMatrixCheckbox(answer, config, baseOptions, mockTranslatedText);
    expect(result).toBe('');
  });

  it('当max_select为0或空字符串时，不应进行最大值校验', () => {
    const config1 = { ...baseConfig, max_select: 0 };
    const config2 = { ...baseConfig, max_select: '' as any };
    const answer = [
      [1, 2, 3, 4, 5], // 第1行选择了5个
      [1, 2, 3, 4], // 第2行选择了4个
      [1, 2, 3] // 第3行选择了3个
    ];

    const result1 = validateMatrixCheckbox(answer, config1, baseOptions, mockTranslatedText);
    const result2 = validateMatrixCheckbox(answer, config2, baseOptions, mockTranslatedText);

    expect(result1).toBe('');
    expect(result2).toBe('');
  });

  it('当有多行不满足条件时，应返回第一个检测到的错误', () => {
    const config = { ...baseConfig, min_select: 2, max_select: 3 };
    const answer = [
      [1], // 第1行选择不足
      [], // 第2行选择不足
      [1, 2, 3, 4] // 第3行选择过多
    ];

    const result = validateMatrixCheckbox(answer, config, baseOptions, mockTranslatedText);
    expect(result).toBe('第1行最少选2个。');
  });

  it('当min_select和max_select都有限制时，应先检查最小值再检查最大值', () => {
    const config = { ...baseConfig, min_select: 2, max_select: 3 };

    // 测试最小值不满足的情况
    const answer1 = [
      [1], // 第1行选择不足
      [1, 2, 3, 4] // 第2行选择过多
    ];
    const result1 = validateMatrixCheckbox(answer1, config, baseOptions, mockTranslatedText);
    expect(result1).toBe('第1行最少选2个。');

    // 测试最大值不满足的情况
    const answer2 = [
      [1, 2], // 第1行满足最小值
      [1, 2, 3, 4] // 第2行选择过多
    ];
    const result2 = validateMatrixCheckbox(answer2, config, baseOptions, mockTranslatedText);
    expect(result2).toBe('第2行最多选3个。');
  });
});
