import type { EvalModeItem, EvalModePageQuery } from './types';

function delay<T>(data: T, ms = 180): Promise<T> {
  return new Promise((resolve) => setTimeout(() => resolve(data), ms));
}

const store: EvalModeItem[] = [
  {
    id: 'tms_eval_quiz',
    modeCode: 'quiz',
    modeName: '提问',
    needPaper: '0',
    needQuiz: '1',
    needPractice: '0',
    enabled: '1',
    remark: '现场提问考核',
  },
  {
    id: 'tms_eval_practice',
    modeCode: 'practice',
    modeName: '现场操作',
    needPaper: '0',
    needQuiz: '0',
    needPractice: '1',
    enabled: '1',
    remark: '实操评分',
  },
  {
    id: 'tms_eval_exam',
    modeCode: 'exam',
    modeName: '在线考试',
    needPaper: '1',
    needQuiz: '0',
    needPractice: '0',
    enabled: '1',
    remark: '发布任务时生成在线考试待考行',
  },
  {
    id: 'tms_eval_none',
    modeCode: 'none',
    modeName: '无需考核',
    needPaper: '0',
    needQuiz: '0',
    needPractice: '0',
    enabled: '1',
    remark: '',
  },
];

export function mockQueryEvalModes(params: EvalModePageQuery = {}) {
  const { currentPage = 1, pageSize = 20, keyword = '', enabled } = params;
  let list = [...store];
  if (enabled) list = list.filter((x) => x.enabled === enabled);
  if (keyword) {
    const k = keyword.trim().toLowerCase();
    list = list.filter(
      (x) => x.modeCode.toLowerCase().includes(k) || x.modeName.toLowerCase().includes(k),
    );
  }
  const start = (currentPage - 1) * pageSize;
  return delay({
    list: list.slice(start, start + pageSize),
    pagination: { total: list.length, currentPage, pageSize },
  });
}

export async function mockGetEvalMode(id: string) {
  await delay(null);
  const row = store.find((x) => x.id === id);
  if (!row) throw new Error('考核方式不存在');
  return { ...row };
}

export async function mockSaveEvalMode(data: Partial<EvalModeItem> & { id?: string }) {
  await delay(null);
  if (data.id) {
    const row = store.find((x) => x.id === data.id);
    if (!row) throw new Error('考核方式不存在');
    if (data.modeCode && data.modeCode !== row.modeCode) {
      if (store.some((x) => x.modeCode === data.modeCode && x.id !== data.id)) {
        throw new Error('方式编码已存在');
      }
    }
    Object.assign(row, data);
    return row;
  }
  if (!data.modeCode) throw new Error('请填写方式编码');
  if (store.some((x) => x.modeCode === data.modeCode)) throw new Error('方式编码已存在');
  const row: EvalModeItem = {
    id: `em_${Date.now()}`,
    modeCode: data.modeCode,
    modeName: data.modeName || data.modeCode,
    needPaper: (data.needPaper as any) || '0',
    needQuiz: (data.needQuiz as any) || '0',
    needPractice: (data.needPractice as any) || '0',
    enabled: (data.enabled as any) || '1',
    remark: data.remark || '',
  };
  store.push(row);
  return row;
}

export async function mockSetEvalModeEnabled(id: string, enabled: '0' | '1') {
  await delay(null);
  const row = store.find((x) => x.id === id);
  if (!row) throw new Error('考核方式不存在');
  row.enabled = enabled;
  return row;
}

export async function mockDeleteEvalMode(id: string) {
  await delay(null);
  const idx = store.findIndex((x) => x.id === id);
  if (idx < 0) throw new Error('考核方式不存在');
  store.splice(idx, 1);
  return true;
}
