import { post, upload, download } from '@/utils/request'

/**
 * 题库详情
 * @param data
 */
export function fetchDetail(id) {
  return post('/exam/api/qu/qu/detail', { id: id })
}

/**
 * 保存题库
 * @param data
 */
export function saveData(data) {
  return post('/exam/api/qu/qu/save', data)
}

/**
 * 导出
 * @param data
 */
export function exportExcel(data) {
  return download('/exam/api/qu/qu/export', data, '导出的数据.xlsx')
}

/**
 * 导入模板
 * @param data
 */
export function importTemplate() {
  return download('/exam/api/qu/qu/import/template', {}, 'qu-import-template.xlsx')
}

/**
 * 导出
 * @param data
 */
export function importExcel(file) {
  return upload('/exam/api/qu/qu/import', file)
}

/**
 * 编程题详情
 * @param data
 */
export function fetchProgrammingDetail(id) {
  // 模拟API调用
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({
        code: 200,
        data: {
          id: id || '1',
          title: '两数之和',
          level: '1',
          content: '给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出和为目标值 target 的那两个整数，并返回它们的数组下标。\n\n你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。',
          inputDesc: '第一行输入一个整数数组 nums，以空格分隔\n第二行输入一个整数 target',
          outputDesc: '输出两个整数，表示和为 target 的两个数的下标',
          sampleInput: '[2, 7, 11, 15]\n9',
          sampleOutput: '0 1',
          timeLimit: 1000,
          memoryLimit: 256,
          standardCode: '#include <iostream>\n#include <vector>\n#include <unordered_map>\n\nusing namespace std;\n\nvector<int> twoSum(vector<int>& nums, int target) {\n    unordered_map<int, int> map;\n    for (int i = 0; i < nums.size(); i++) {\n        int complement = target - nums[i];\n        if (map.find(complement) != map.end()) {\n            return {map[complement], i};\n        }\n        map[nums[i]] = i;\n    }\n    return {};\n}\n\nint main() {\n    int n, target;\n    vector<int> nums;\n    \n    // 读取输入\n    char c;\n    cin >> c; // 读取 [\n    while (true) {\n        int num;\n        cin >> num;\n        nums.push_back(num);\n        cin >> c; // 读取 , 或 ]\n        if (c == \']\') break;\n    }\n    cin >> target;\n    \n    // 计算结果\n    vector<int> result = twoSum(nums, target);\n    \n    // 输出结果\n    cout << result[0] << " " << result[1] << endl;\n    \n    return 0;\n}',
          testCases: [
            {
              input: '[2, 7, 11, 15]\n9',
              output: '0 1'
            },
            {
              input: '[3, 2, 4]\n6',
              output: '1 2'
            }
          ],
          createTime: '2023-05-15 10:30:00'
        },
        msg: 'success'
      })
    }, 500)
  })
}

/**
 * 保存编程题
 * @param data
 */
export function saveProgrammingData(data) {
  // 模拟API调用
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('保存的编程题数据:', data)
      resolve({
        code: 200,
        data: {
          id: data.id || Math.floor(Math.random() * 1000).toString()
        },
        msg: 'success'
      })
    }, 500)
  })
}

/**
 * 提交代码
 * @param data
 */
export function submitCode(data) {
  // 模拟API调用
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('提交的代码:', data)
      
      // 随机模拟成功或失败
      const success = Math.random() > 0.3
      
      resolve({
        code: 200,
        data: {
          success: success,
          status: success ? '通过' : '未通过',
          message: success ? '恭喜，您的代码通过了所有测试用例！' : '您的代码未通过所有测试用例',
          output: success ? '0 1' : '1 0',
          expectedOutput: '0 1',
          score: success ? 10 : 0,
          executionTime: Math.floor(Math.random() * 100) + 'ms',
          memoryUsage: Math.floor(Math.random() * 10) + 'MB'
        },
        msg: 'success'
      })
    }, 1500)
  })
}

/**
 * 运行代码
 * @param data
 */
export function runCode(data) {
  // 模拟API调用
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('运行的代码:', data)
      
      // 随机模拟成功或失败
      const success = Math.random() > 0.3
      
      resolve({
        code: 200,
        data: {
          success: success,
          status: success ? '运行成功' : '运行失败',
          message: success ? '代码运行成功' : '代码运行出错，请检查您的代码',
          output: success ? '0 1' : '编译错误: 第10行: 缺少分号',
          executionTime: success ? Math.floor(Math.random() * 100) + 'ms' : '-',
          memoryUsage: success ? Math.floor(Math.random() * 10) + 'MB' : '-'
        },
        msg: 'success'
      })
    }, 1000)
  })
}

/**
 * 删除编程题
 * @param id
 */
export function deleteProgramming(id) {
  // 模拟API调用
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('删除的编程题ID:', id)
      resolve({
        code: 200,
        data: null,
        msg: 'success'
      })
    }, 500)
  })
}

/**
 * 获取编程题列表
 */
export function fetchProgrammingList() {
  // 模拟API调用
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({
        code: 200,
        data: {
          records: [
            {
              id: '1',
              title: '两数之和',
              level: '1',
              timeLimit: 1000,
              memoryLimit: 256,
              createTime: '2023-05-15 10:30:00'
            },
            {
              id: '2',
              title: '反转链表',
              level: '2',
              timeLimit: 1000,
              memoryLimit: 256,
              createTime: '2023-05-16 14:20:00'
            },
            {
              id: '3',
              title: '最长回文子串',
              level: '3',
              timeLimit: 2000,
              memoryLimit: 512,
              createTime: '2023-05-17 09:15:00'
            }
          ],
          total: 3,
          size: 10,
          current: 1
        },
        msg: 'success'
      })
    }, 500)
  })
}

