import mockjs from 'mockjs';
import { format, delay } from 'roadhog-api-doc';
import { campusList } from './mock/campus';
import { terminalList } from './mock/terminal';
import { merchantList } from './mock/merchant';
import { resourceList } from './mock/resource';
import { groupList } from './mock/group';
import { tagList } from './mock/tag';
import { wareList } from './mock/ware';
import { lessonList } from './mock/lesson';
import { courseList } from './mock/course';
import { supportList } from './mock/support';
import { comboList } from './mock/combo';
import { orderList } from './mock/order';
import { signature } from './mock/signature';
import { cmsUserList } from './mock/cmsUser';
import * as api from './src/utils/api';

// mock数据持久化
global.campusList = campusList;
global.terminalList = terminalList;
global.merchantList = merchantList;
global.resourceList = resourceList;
global.groupList = groupList;
global.tagList = tagList;
global.wareList = wareList;
global.lessonList = lessonList;
global.courseList = courseList;
global.supportList = supportList;
global.comboList = comboList;
global.orderList = orderList;
global.signature = signature;
global.cmsUserList = cmsUserList;

// 操作成功响应内容
const SUCCESS = { code: 200, success: true, message: null };
// 资源未找到响应内容
const NOTFOUND = { code: 404, message: 'Not Found!' };

// 查询
const query = (dataset, params) => {
  const pageSize = parseInt(params.pageSize) || 10;
  const pageNo = parseInt(params.pageNo) || 1;
  delete params['pageSize'];
  delete params['pageNo'];
  const queryKeys = Object.keys(params);
  const newDataset = dataset.filter(item => {
    let flag = true;
    for (let key of queryKeys) {
      if (item[key] !== params[key]) {
        flag = false;
        break;
      }
    }
    return flag;
  });
  const totalSize = newDataset.length || 0;
  const list = newDataset.slice(pageSize * (pageNo - 1), pageSize * pageNo);
  return {
    ...SUCCESS,
    data: { pageSize, pageNo, totalSize: newDataset.length, list }
  };
}

// 添加
const create = (dataset, params) => {
  const last = dataset[dataset.length - 1];
  const data = { ...params, id: last.id + 1 };
  dataset.push(data);
  return {
    ...SUCCESS,
    data,
  };
}

// 更新
const update = (dataset, params) => {
  for (let index in dataset) {
    if (dataset[index].id === params.id) {
      dataset[index] = { ...dataset[index], ...params };
    }
  }
  return {
    ...SUCCESS,
  }
}

const queryArray = (array, key, keyAlias = 'key') => {
  if (!(array instanceof Array)) {
    return null
  }
  let data

  for (let item of array) {
    if (item[keyAlias] === key) {
      data = item
      break
    }
  }

  if (data) {
    return data
  }
  return null
}

// 查询一条
const queryOne = (dataset, id, res) => {
  const target = queryArray(dataset, id, 'id');
  if (target) {
    res.send({ ...SUCCESS, data: { ...target } });
  } else {
    res.send({ ...NOTFOUND, data: {} });
  }
}

// 删除
const remove = (dataset, id, res) => {
  const data = queryArray(dataset, id, 'id');
  if (data) {
    dataset.map(item => { item.id === data.id ? item.status = 'DEL' : null });
    res.send(SUCCESS);
  } else {
    res.send(NOTFOUND);
  }
}

// mock数据
const proxy = {
  // 资源
  [`POST ${api.resource.replace('/:id', '')}`]: (req, res) => {
    console.log(`[POST][${api.resource}]`, req.body);
    res.send(create(global.resourceList, req.body));
  },
  [`DELETE ${api.resource}`]: (req, res) => {
    console.log(`[DELETE][${api.resource}]`, req.params);
    const { id } = req.params;
    remove(global.resourceList, id, res);
  },
  [`PUT ${api.resource.replace('/:id', '')}`]: (req, res) => {
    console.log(`[PUT][${api.resource}]`, req.body);
    res.send(update(global.resourceList, req.body));
  },
  [`GET ${api.resources}`]: (req, res) => {
    console.log(`[GET][${api.resources}]`, req.query);
    res.send(query(global.resourceList, req.query));
  },
  [`GET ${api.signature}`]: (req, res) => {
    console.log(`[GET][${api.signature}]`, req.query);
    res.send({ ...SUCCESS, data: global.signature });
  },
  // 校区
  [`GET ${api.campuses}`]: (req, res) => {
    res.send(query(global.campusList, req.query));
  },
  [`POST ${api.campus.replace('/:id', '')}`]: (req, res) => {
    res.send(create(global.campusList, req.body));
  },
  [`PUT ${api.campus.replace('/:id', '')}`]: (req, res) => {
    res.send(update(global.campusList, req.body));
  },
  // 终端
  [`GET ${api.terminals}`]: (req, res) => {
    res.send(query(global.terminalList, req.query));
  },
  [`POST ${api.terminal.replace('/:id', '')}`]: (req, res) => {
    res.send(create(global.terminalList, req.body));
  },
  [`PUT ${api.terminal.replace('/:id', '')}`]: (req, res) => {
    res.send(update(global.terminalList, req.body));
  },
  [`DELETE ${api.terminal}`]: (req, res) => {
    const { id } = req.params;
    remove(global.terminalList, id, res);
  },
  // 厂商
  [`POST ${api.merchant.replace('/:id', '')}`]: (req, res) => {
    res.send(create(global.merchantList, req.body));
  },
  [`DELETE ${api.merchant}`]: (req, res) => {
    const { id } = req.params;
    remove(global.merchantList, id, res);
  },
  [`PUT ${api.merchant.replace('/:id', '')}`]: (req, res) => {
    res.send(update(global.merchantList, req.body));
  },
  [`GET ${api.merchants}`]: (req, res) => {
    res.send(query(global.merchantList, req.query));
  },
  [`GET ${api.merchant}`]: (req, res) => {
    const { id } = req.params;
    queryOne(global.merchantList, id, res);
  },
  // 标签组
  [`POST ${api.group.replace('/:id', '')}`]: (req, res) => {
    res.send(create(global.groupList, req.body));
  },
  [`DELETE ${api.group}`]: (req, res) => {
    const { id } = req.params;
    remove(global.groupList, id, res);
  },
  [`PUT ${api.group.replace('/:id', '')}`]: (req, res) => {
    res.send(update(global.groupList, req.body));
  },
  [`GET ${api.groups}`]: (req, res) => {
    console.log(`[${api.groups}]`, req.query);
    res.send(query(global.groupList, req.query));
  },
  [`GET ${api.group}`]: (req, res) => {
    const { id } = req.params;
    queryOne(global.groupList, id, res);
  },
  // 标签
  [`POST ${api.tag.replace('/:id', '')}`]: (req, res) => {
    res.send(create(global.tagList, req.body));
  },
  [`DELETE ${api.tag}`]: (req, res) => {
    const { id } = req.params;
    remove(global.tagList, id, res);
  },
  [`PUT ${api.tag.replace('/:id', '')}`]: (req, res) => {
    res.send(update(global.tagList, req.body));
  },
  [`GET ${api.tags}`]: (req, res) => {
    console.log(`[${api.tags}]`, req.query);
    res.send(query(global.tagList, req.query));
  },
  [`GET ${api.tag}`]: (req, res) => {
    console.log(`[${api.tag}]`, req.params);
    const { id } = req.params;
    queryOne(global.tagList, id, res);
  },
  // 课件
  [`POST ${api.ware.replace('/:id', '')}`]: (req, res) => {
    console.log(`[POST][${api.ware}]`, req.body);
    res.send(create(global.wareList, req.body));
  },
  [`DELETE ${api.ware}`]: (req, res) => {
    console.log(`[DELETE][${api.ware}]`, req.params);
    const { id } = req.params;
    remove(global.wareList, id, res);
  },
  [`PUT ${api.ware.replace('/:id', '')}`]: (req, res) => {
    console.log(`[PUT][${api.ware}]`, req.body);
    res.send(update(global.wareList, req.body));
  },
  [`GET ${api.wares}`]: (req, res) => {
    console.log(`[GET][${api.wares}]`, req.query);
    res.send(query(global.wareList, req.query));
  },
  [`GET ${api.ware}`]: (req, res) => {
    console.log(`[GET][${api.ware}]`, req.params);
    const { id } = req.params;
    queryOne(global.wareList, id, res);
  },
  // 课
  [`POST ${api.lesson.replace('/:id', '')}`]: (req, res) => {
    console.log(`[POST][${api.lesson}]`, req.body);
    res.send(create(global.lessonList, req.body));
  },
  [`DELETE ${api.lesson}`]: (req, res) => {
    console.log(`[DELETE][${api.lesson}]`, req.params);
    const { id } = req.params;
    remove(global.lessonList, id, res);
  },
  [`PUT ${api.lesson.replace('/:id', '')}`]: (req, res) => {
    console.log(`[PUT][${api.lesson}]`, req.body);
    res.send(update(global.lessonList, req.body));
  },
  [`GET ${api.lessons}`]: (req, res) => {
    console.log(`[GET][${api.lessons}]`, req.query);
    res.send(query(global.lessonList, req.query));
  },
  [`GET ${api.lesson}`]: (req, res) => {
    console.log(`[GET][${api.lesson}]`, req.params);
    const { id } = req.params;
    queryOne(global.lessonList, id, res);
  },
  // 课程
  [`POST ${api.course.replace('/:id', '')}`]: (req, res) => {
    console.log(`[POST][${api.course}]`, req.body);
    res.send(create(global.courseList, req.body));
  },
  [`DELETE ${api.course}`]: (req, res) => {
    console.log(`[DELETE][${api.course}]`, req.params);
    const { id } = req.params;
    remove(global.courseList, id, res);
  },
  [`PUT ${api.course.replace('/:id', '')}`]: (req, res) => {
    console.log(`[PUT][${api.course}]`, req.body);
    res.send(update(global.courseList, req.body));
  },
  [`GET ${api.courses}`]: (req, res) => {
    console.log(`[GET][${api.courses}]`, req.query);
    res.send(query(global.courseList, req.query));
  },
  [`GET ${api.course}`]: (req, res) => {
    console.log(`[GET][${api.course}]`, req.params);
    const { id } = req.params;
    queryOne(global.courseList, id, res);
  },
  // 周边
  [`POST ${api.support.replace('/:id', '')}`]: (req, res) => {
    console.log(`[POST][${api.support}]`, req.body);
    res.send(create(global.supportList, req.body));
  },
  [`DELETE ${api.support}`]: (req, res) => {
    console.log(`[DELETE][${api.support}]`, req.params);
    const { id } = req.params;
    remove(global.supportList, id, res);
  },
  [`PUT ${api.support.replace('/:id', '')}`]: (req, res) => {
    console.log(`[PUT][${api.support}]`, req.body);
    res.send(update(global.supportList, req.body));
  },
  [`GET ${api.supports}`]: (req, res) => {
    console.log(`[GET][${api.supports}]`, req.query);
    res.send(query(global.supportList, req.query));
  },
  [`GET ${api.support}`]: (req, res) => {
    console.log(`[GET][${api.support}]`, req.params);
    const { id } = req.params;
    queryOne(global.supportList, id, res);
  },
  // 课程包
  [`POST ${api.combo.replace('/:id', '')}`]: (req, res) => {
    console.log(`[POST][${api.combo}]`, req.body);
    res.send(create(global.comboList, req.body));
  },
  [`DELETE ${api.combo}`]: (req, res) => {
    console.log(`[DELETE][${api.combo}]`, req.params);
    const { id } = req.params;
    remove(global.comboList, id, res);
  },
  [`PUT ${api.combo.replace('/:id', '')}`]: (req, res) => {
    console.log(`[PUT][${api.combo}]`, req.body);
    res.send(update(global.comboList, req.body));
  },
  [`GET ${api.combos}`]: (req, res) => {
    console.log(`[GET][${api.combos}]`, req.query);
    res.send(query(global.comboList, req.query));
  },
  [`GET ${api.combo}`]: (req, res) => {
    console.log(`[GET][${api.combo}]`, req.params);
    const { id } = req.params;
    queryOne(global.comboList, id, res);
  },
  // 订单
  [`POST ${api.order.replace('/:id', '')}`]: (req, res) => {
    console.log(`[POST][${api.order}]`, req.body);
    res.send(create(global.orderList, req.body));
  },
  [`DELETE ${api.order}`]: (req, res) => {
    console.log(`[DELETE][${api.order}]`, req.params);
    const { id } = req.params;
    remove(global.orderList, id, res);
  },
  [`PUT ${api.order.replace('/:id', '')}`]: (req, res) => {
    console.log(`[PUT][${api.order}]`, req.body);
    res.send(update(global.orderList, req.body));
  },
  [`GET ${api.orders}`]: (req, res) => {
    console.log(`[GET][${api.orders}]`, req.query);
    res.send(query(global.orderList, req.query));
  },
  [`GET ${api.order}`]: (req, res) => {
    console.log(`[GET][${api.order}]`, req.params);
    const { id } = req.params;
    queryOne(global.orderList, id, res);
  },
  // cms用户
  [`POST ${api.cmsUser.replace('/:id', '')}`]: (req, res) => {
    console.log(`[POST][${api.cmsUser}]`, req.body);
    res.send(create(global.cmsUserList, req.body));
  },
  [`DELETE ${api.cmsUser}`]: (req, res) => {
    console.log(`[DELETE][${api.cmsUser}]`, req.params);
    const { id } = req.params;
    remove(global.cmsUserList, id, res);
  },
  [`PUT ${api.cmsUser.replace('/:id', '')}`]: (req, res) => {
    console.log(`[PUT][${api.cmsUser}]`, req.body);
    res.send(update(global.cmsUserList, req.body));
  },
  [`GET ${api.cmsUsers}`]: (req, res) => {
    console.log(`[GET][${api.cmsUsers}]`, req.query);
    res.send(query(global.cmsUserList, req.query));
  },
};

// 是否禁用代理
const noProxy = process.env.NO_PROXY === 'true';

// 根据是否禁用代理来选择是mock数据还是真实接口
export default noProxy ? {} : delay(proxy, 500);
// export default noProxy ? {} : proxy;