import { getMap, formatTreeData } from '@src/services/Tools';
import main from './main';
import course from './course';
import tools from './tools';
import error from './error';
import note from './note';
import answer from './answer';
import report from './report';
import data from './data';
import collect from './collect';
import order from './order';
import message from './message';

import { TextbookMinYear, CourseModule } from '../../../Constant';
import { Main } from '../../stores/main';

export default [main, course, tools, error, note, answer, report, data, collect, order, message];


export function refreshQuestionType(compontent, subject, questionType, { all, needSentence, allSubject }) {
  return Main.getExercise().then(result => {
    const list = result.filter(row => (needSentence ? true : row.isExamination)).map(row => {
      row.title = `${row.titleZh}${row.titleEn}`;
      row.key = row.extend;
      return row;
    });
    const tree = formatTreeData(list, 'id', 'title', 'parentId');
    compontent.questionSubjectMap = getMap(tree, 'key', 'children');
    compontent.questionSubjectSelect = tree.filter(row => row.level === 1 && (allSubject ? true : row.children.length > 1));
    if (all) {
      compontent.questionSubjectSelect.forEach(row => {
        row.children.unshift({
          title: '全部',
          key: '',
        });
      });
      compontent.questionSubjectSelect.unshift({
        title: '全部',
        key: '',
      });
    }
    compontent.setState({
      questionSubjectSelect: compontent.questionSubjectSelect,
      questionSubjectMap: compontent.questionSubjectMap,
    });
    return {
      questionTypes: questionType || (subject ? compontent.questionSubjectMap[subject].map(row => row.key).filter(row => row) : null),
    };
  });
}

export function refreshStruct(compontent, module, one, two, { all, needTextbook, needPreview }) {
  switch (module) {
    case 'exercise':
      return Main.getExerciseAll().then(result => {
        const tmp = result.filter(row => row.level > 2).map(row => {
          row.title = `${row.titleZh}`;
          row.key = row.titleEn;
          return row;
        });
        const idsMap = getMap(tmp, 'id', 'key');
        const map = {};
        tmp.forEach(row => {
          if (!map[row.key]) {
            map[row.key] = {
              title: row.title,
              key: row.key,
              structIds: [],
              parentId: row.level > 3 ? idsMap[row.parentId] : null,
              subject: [],
              questionType: [],
            };
          }
          const item = map[row.key];
          item.structIds.push(row.id);
          if (item.subject.indexOf(row.subject) < 0) {
            item.subject.push(row.subject);
          }
          if (item.questionType.indexOf(row.questionType) < 0) {
            item.questionType.push(row.questionType);
          }
        });
        const list = Object.values(map);
        if (needPreview) {
          list.push({
            title: '预习作业',
            key: 'preview',
            id: 'preview',
          });
          CourseModule.forEach(row => {
            list.push({
              title: row.label,
              key: row.value,
              parentId: 'preview',
            });
          });
        }
        let courseModules = null;
        let structIds = null;
        if (one === 'preview') {
          if (!two) {
            courseModules = CourseModule.map(row => row.value);
          } else {
            courseModules = [two];
          }
        } else if (one) {
          const resultMap = getMap(list, 'key', 'structIds');
          if (!two) {
            structIds = resultMap[one];
          } else {
            structIds = resultMap[two];
          }
        }

        const tree = formatTreeData(list, 'key', 'title', 'parentId');
        const oneSelect = tree;
        const twoSelectMap = getMap(tree, 'key', 'children');
        if (all) {
          oneSelect.forEach(row => {
            row.children.unshift({
              title: '全部',
              key: '',
            });
          });
          oneSelect.unshift({
            title: '全部',
            key: '',
          });
        }
        compontent.setState({ oneSelect, twoSelectMap });

        return {
          structIds,
          courseModules,
        };
      });
    case 'examination':
      return Main.getExamination().then(result => {
        const list = result.map(row => {
          row.title = `${row.titleZh}${row.titleEn}`;
          row.key = `${row.id}`;
          return row;
        });
        if (needTextbook) {
          list.push({
            title: '数学机经',
            key: 'textbook',
            id: 'textbook',
          });
          list.push({
            title: '最新',
            key: 'latest',
            parentId: 'textbook',
          });

          const nowYear = new Date().getFullYear();
          for (let i = TextbookMinYear; i <= nowYear; i += 1) {
            list.push({
              title: i.toString(),
              key: i.toString(),
              parentId: 'textbook',
            });
          }
        }
        let latest = null;
        let year = null;
        let structIds = null;
        if (one === 'textbook') {
          if (!two) {
            latest = false;
          } else if (two === 'latest') {
            latest = true;
          } else {
            year = two;
          }
        } else if (one) {
          if (!two) {
            structIds = [Number(one)];
          } else {
            structIds = [Number(two)];
          }
        }

        const tree = formatTreeData(list, 'key', 'title', 'parentId');
        const oneSelect = tree;
        const twoSelectMap = getMap(tree, 'key', 'children');
        if (all) {
          oneSelect.forEach(row => {
            row.children.unshift({
              title: '全部',
              key: '',
            });
          });
          oneSelect.unshift({
            title: '全部',
            key: '',
          });
        }
        compontent.setState({ oneSelect, twoSelectMap });
        return {
          structIds,
          latest,
          year,
        };
      });
    default:
      return Promise.resolve({});
  }
}