/* eslint-disable no-shadow */
import moment from 'moment';
import { genModules } from '../src/mock/modules';
import { getTasks } from '../src/mock/tasks';
import toFilters from '../src/mock/filter';

const modules = genModules();
const tasks = getTasks();

const domains = [
  {
    id: 1,
    name: '虚拟基地01',
  },
  {
    id: 2,
    name: '虚拟基地02',
  },
  {
    id: 3,
    name: '虚拟基地03',
  },
  {
    id: 4,
    name: '虚拟基地04',
  },
  {
    id: 5,
    name: '虚拟基地05',
  },
];

const getDomain = (id) => {
  const domain = domains.filter(domain => domain.id === id);
  return domain ? domain[0] : null;
};

const dealWithData = (req) => {
  const { sort, order } = req.query;
  const filters = [];
  for (const queryKey in req.query) {
    if (queryKey.indexOf('f-') === 0) {
      filters.push(toFilters(queryKey, req.query[queryKey]));
    }
  }
  let data = tasks.filter((value) => {
    return filters.map(filter => filter(value)).reduce((ret, cur) => ret && cur, true);
  });
  if (sort) {
    data = data.sort((a, b) => {
      const va = a[sort];
      const vb = b[sort];
      if (order === 'desc') {
        if (moment.isMoment(va) || moment.isDate(va) || moment.isMoment(vb) || moment.isDate(vb)) {
          if (moment(va).isAfter(moment(vb))) {
            return 1;
          } else if (moment(va).isSame(moment(vb))) {
            return 0;
          } else {
            return -1;
          }
        } else if (va > vb) {
          return 1;
        } else if (va === vb) {
          return 0;
        } else {
          return -1;
        }
      } else if (moment.isMoment(va) || moment.isDate(va) || moment.isMoment(vb) || moment.isDate(vb)) {
        if (moment(va).isBefore(moment(vb))) {
          return 1;
        } else if (moment(va).isSame(moment(vb))) {
          return 0;
        } else {
          return -1;
        }
      } else if (va < vb) {
        return 1;
      } else if (va === vb) {
        return 0;
      } else {
        return -1;
      }
    });
  }
  return data;
};

let currentDomainId = null;

const wrapResponse = (response) => {
  return {
    errorCode: 0,
    data: response,
  };
};

module.exports = {

  '/api/user/logout': (req, res) => {
    res.status(204).end();
  },
  '/api/domain/all': wrapResponse(domains),
  '/api/domain/switch': (req, res) => {
    const { domainId } = req.query;
    const intDomainId = parseInt(domainId, 10);
    const domainIds = domains.map(domain => domain.id);
    if (domainIds.indexOf(intDomainId) !== -1) {
      if (currentDomainId) {
        res.send(wrapResponse(getDomain(currentDomainId)));
      } else {
        res.status(204).end();
      }
      currentDomainId = intDomainId;
    } else {
      res.status(500).send({
        errorCode: 0x00010010,
        message: '无效的项目ID。',
      });
    }
  },
  '/api/domain/current': (req, res) => {
    res.send(wrapResponse(getDomain(currentDomainId)));
  },
  '/api/module/all/info': (req, res) => {
    console.log('/api/module/all/info');
    const { all } = modules;
    const publics = modules.public;
    const findModule = id => all.filter(m => m.id === id).pop();
    const fetchParent = (module) => {
      if (module.parent) {
        const parent = findModule(module.parent);
        return parent ? [parent, ...fetchParent(parent)] : [];
      } else {
        return [];
      }
    };
    const parents = new Set();
    publics.forEach((m) => {
      const p0 = fetchParent(m);
      p0.forEach((p) => {
        parents.add(p);
      });
    });
    res.send(wrapResponse([
      ...publics,
      ...parents,
    ]));
  },
  '/api/bpm/task/all/count': (req, res) => {
    res.send(wrapResponse(dealWithData(req).length));
  },
  '/api/bpm/task/all/info': (req, res) => {
    const pst = Number.parseInt(req.query.pst, 10);
    const psz = Number.parseInt(req.query.psz, 10);
    res.send(wrapResponse(dealWithData(req).slice(pst, pst + psz)));
  },
};