'use strict';

const Service = require('egg').Service;
const assert = require('assert');
const moment = require('moment');
class RoleService extends Service {
  async create({ name, code, state }) {
    assert(name, '名称不存在');
    assert(code, '编码不存在');
    assert(state, '状态不存在');
    const { Role: model } = this.ctx.model;
    const createAt = moment().format('x');
    try {
      const isrole = await model.find({ code });
      if (isrole.length > 0) {
        return { errcode: -2001, errmsg: '编码已存在' };
      }
      await model.create({ name, code, createAt, state });
      return { errmsg: '', errcode: 0 };
    } catch (error) {
      throw new Error({ errcode: -2001, errmsg: '添加失败' });
    }
  }
  async update({ name, state, _id, adminMenuList }) {
    assert(_id, 'id不存在');
    const { Role: model } = this.ctx.model;
    try {
      await model.findById(_id).update({ name, state, adminMenuList });
      return { errmsg: '', errcode: 0 };
    } catch (error) {
      throw new Error({ errcode: -2001, errmsg: '修改失败' });
    }
  }
  async del({ id }) {
    assert(id, 'id不存在');
    const { Role: model } = this.ctx.model;
    const { AdminUser: usermodel } = this.ctx.model;
    try {
      const role = await model.findById(id);
      // 关联删除 数组查询
      const userList = await usermodel.find({ roleList: { $in: [ role.code ] } });
      // 轮询
      userList.forEach(async e => {
        const roleList = e.roleList.filter(p => p !== role.code);
        await usermodel.findById(e._id).update({ roleList });
      });
      // 结束
      await model.findById(id).remove();
      return { errmsg: '', errcode: 0 };
    } catch (error) {
      throw new Error({ errcode: -2001, errmsg: '删除失败' });
    }
  }
  async query({ skip, limit, name, code, state }) {
    const { Role: model } = this.ctx.model;
    const filter = {};
    if (name) filter.name = name;
    if (code) filter.state = code;
    if (state) filter.acct = state;
    try {
      const total = await model.find({ ...filter });
      let res;
      if (skip && limit) {
        res = await model.find({ ...filter }).skip(Number(skip) * Number(limit)).limit(Number(limit));
      } else {
        res = await model.find({ ...filter });
      }
      return { errmsg: '', errcode: 0, data: res, total: total.length };
    } catch (error) {
      console.log(error);
      throw new Error({ errcode: -2001, errmsg: '查询失败' });
    }
  }
}

module.exports = RoleService;