package com.yfd.platform.system.controller;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.yfd.platform.annotation.Log;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.system.domain.SysOrganization;
import com.yfd.platform.system.domain.SysRole;
import com.yfd.platform.system.domain.SysUser;
import com.yfd.platform.system.mapper.SysRoleMapper;
import com.yfd.platform.system.service.ISysOrganizationService;
import com.yfd.platform.system.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * <p>
 * 系统组织框架 前端控制器
 * </p>
 *
 * @author zhengsl
 * @since 2021-12-15
 */
@RestController
@RequestMapping("/system/organization")
@Api(value = "SysOrganizationController", tags = "系统组织框架")
public class SysOrganizationController {

    @Resource
    private ISysOrganizationService organizationService;

    @Resource
    private IUserService userService;

    /***********************************
     * 用途说明：获取组织范围树结构
     * 参数说明
     *parentid      上级id
     * params       名称（根据名称查询二级）
     * 返回值说明:  组织树集合
     ***********************************/
    @PostMapping("/getOrgScopeTree")
    @ApiOperation("获取组织范围树结构")
    @ResponseBody
    public List<Map<String, Object>> getOrgScopeTree(String roleId) {
        return organizationService.getOrgScopeTree(roleId);
    }

    /***********************************
     * 用途说明：获取组织范围
     * 参数说明
     * 返回值说明:  组织范围集合
     ***********************************/
    @PostMapping("/getOrgTree")
    @ApiOperation("获取组织结构树")
    @ResponseBody
    public List<Map<String, Object>> getOrgTree(String parentid,
                                                String params) {
        return organizationService.getOrgTree(parentid, params);
    }

    /***********************************
     * 用途说明：根据企业ID查询组织详情
     * 参数说明
     * id        企业id
     * 返回值说明:  系统组织框架对象
     ***********************************/
    @PostMapping("/getOrganizationById")
    @ApiOperation("根据企业ID查询组织信息")
    @ResponseBody
    public ResponseResult getOrganizationById(String id, String orgName) {
        if (StrUtil.isBlank(id)) {
            return ResponseResult.error("查询失败！");
        }
        List<SysOrganization> sysOrganizations =
                organizationService.getOrganizationById(id, orgName);
        return ResponseResult.successData(sysOrganizations);
    }

    /***********************************
     * 用途说明：根据ID查询组织详情
     * 参数说明
     * id        系统组织id
     * 返回值说明:  系统组织框架对象
     ***********************************/
    @PostMapping("/getOneById")
    @ApiOperation("根据ID查询组织详情")
    @ResponseBody
    public ResponseResult getOneById(String id) {
        SysOrganization sysOrganization = organizationService.getById(id);
        return ResponseResult.successData(sysOrganization);
    }

    /***********************************
     * 用途说明：新增系统组织框架
     * 参数说明
     * sysOrganization     系统组织框架对象
     * 返回值说明:  是否新增成功
     ***********************************/
    @Log(module = "系统组织框架", value = "新增企业或者部门！")
    @PostMapping("/addOrg")
    @ApiOperation("新增系统组织框架")
    @ResponseBody
    public ResponseResult addOrg(@RequestBody SysOrganization sysOrganization) {
        //判断是否是否填写 有效 否则默认为 1
        if (StrUtil.isEmpty(sysOrganization.getIsvaild())) {
            sysOrganization.setIsvaild("1");
        }
        //填写 当前用户名称
        sysOrganization.setLastmodifier(userService.getUsername());
        //填写 当前日期
        sysOrganization.setLastmodifydate(new Timestamp(System.currentTimeMillis()));
        //新增 系统组织R
        boolean isOk = organizationService.addOrg(sysOrganization);
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：修改系统组织框架
     * 参数说明
     * sysOrganization     系统组织框架对象
     * 返回值说明:  是否修改成功
     ***********************************/
    @Log(module = "系统组织框架", value = "修改企业或者部门信息！")
    @PostMapping("/updateById")
    @ApiOperation("修改系统组织框架")
    @ResponseBody
    public ResponseResult updateById(@RequestBody SysOrganization sysOrganization) {
        //填写 当前用户名称
        sysOrganization.setLastmodifier(userService.getUsername());
        //填写 当前日期
        sysOrganization.setLastmodifydate(new Timestamp(System.currentTimeMillis()));
        //根据id 修改系统组织
        boolean isOk = organizationService.updateById(sysOrganization);
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：修改系统组织框架
     * 参数说明
     * sysOrganization     系统组织框架对象
     * 返回值说明:  是否修改成功
     ***********************************/
    @Log(module = "系统组织框架", value = "设置企业/部门是否有效！")
    @PostMapping("/setIsValid")
    @ApiOperation("设置组织是否有效")
    @ResponseBody
    public ResponseResult setIsValid(@RequestParam String id,
                                     @RequestParam String isvaild) {
        UpdateWrapper<SysOrganization> updateWrapper = new UpdateWrapper<>();
        //根据id 修改是否有效，最近修改人，最近修改时间
        updateWrapper.eq("id", id).set("isvaild", isvaild).set("lastmodifier"
                , userService.getUsername()).set("lastmodifydate",
                new Timestamp(System.currentTimeMillis()));
        boolean isOk = organizationService.update(updateWrapper);
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：根据id删除系统组织框架
     * 参数说明
     * id     系统组织框架id
     * 返回值说明:  是否删除成功
     ***********************************/
    @Log(module = "系统组织框架", value = "根据ID删除企业或者部门！")
    @PostMapping("/deleteById")
    @ApiOperation("根据id删除系统组织框架")
    @ResponseBody
    public ResponseResult deleteById(@RequestParam String id) {
        String[] orgIds = id.split(",");
        for (String orgId : orgIds) {
            LambdaQueryWrapper<SysOrganization> queryWrapper =
                    new LambdaQueryWrapper<>();
            List<SysOrganization> list =
                    organizationService.list(queryWrapper.eq(SysOrganization::getParentid, orgId));
            List<String> ids =
                    list.stream().map(SysOrganization::getId).collect(Collectors.toList());
            boolean isOk = organizationService.removeById(orgId);
            if (!isOk) {
                continue;
            }
            for (String oid : ids) {
                organizationService.removeById(oid);
            }
        }
        return ResponseResult.success();
    }

}
