package io.gisbi.application.system.controller;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import io.gisbi.application.system.domain.Organization;
import io.gisbi.application.system.service.IOrganizationService;
import io.gisbi.datasource.dao.auto.entity.QrtzSchedulerState;
import io.gisbi.utils.AuthUtils;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import io.gisbi.config.ResponseResult;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 组织机构 前端控制器
 * </p>
 *
 * @author lilin
 * @since 2025-05-08
 */
@RestController
@RequestMapping("/organization")
public class OrganizationController {

    @Resource
    private IOrganizationService organizationService;


    /***********************************
     * 用途说明：新增系统组织框架
     * 参数说明
     * organization     系统组织框架对象
     * 返回值说明:  是否新增成功
     ***********************************/
    @PostMapping("/addOrganization")
    @ResponseBody
    public ResponseResult addOrganization(@RequestBody Organization organization) {
        if (organization == null) {
            return ResponseResult.error("组织信息不能为空");
        }
        //新增 系统组织R
        boolean isOk = organizationService.addOrganization(organization);
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error("新增失败，未知原因");
        }
    }

    /***********************************
     * 用途说明：修改系统组织框架
     * 参数说明
     * organization     系统组织框架对象
     * 返回值说明:  是否修改成功
     ***********************************/
    @PostMapping("/updateOrganizationById")
    @ResponseBody
    public ResponseResult updateOrganizationById(@RequestBody Organization organization) {
        if (StrUtil.isEmpty(organization.getId())) {
            return ResponseResult.error("组织信息id不能为空");
        }

        if (organization == null) {
            return ResponseResult.error("组织信息不能为空");
        }
        //填写 最近修改者
        organization.setLastmodifier(AuthUtils.getUser().getUserId().toString());
        //填写 最近修改时间
        organization.setLastmodifydate(LocalDateTime.now());
        //根据id 修改系统组织
        boolean isOk = organizationService.updateById(organization);
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }


    /***********************************
     * 用途说明：获取企业列表
     * 参数说明
     * id        企业id
     * orgName   部门名称
     * orgtype   组织类型：01-公司  02-部门
     * parentid   上级ID
     * 返回值说明:  企业列表集合
     ***********************************/
    @PostMapping("/getOrganizations")
    @ResponseBody
    public List<Map<String, Object>> getOrganizations(String appId, String  orgtype, String parentid, String orgName) {
        return organizationService.getOrganizations(appId,orgtype, parentid, orgName);
    }

    /***********************************
     * 用途说明：查询全部系统组织框架
     * 参数说明
     * appId      应用ID
     * 返回值说明:  是否新增成功
     ***********************************/
    @PostMapping("/listOrganization")
    @ResponseBody
    public ResponseResult listOrganization(String appId) {
        if (appId == null) {
            return ResponseResult.error("应用ID不能为空");
        }
        LambdaQueryWrapper<Organization> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Organization::getAppId,appId);
        queryWrapper.eq(Organization::getIsvaild,"1");
        List<Organization> list = organizationService.list(queryWrapper);
        return ResponseResult.successData(list);
    }

    /***********************************
     * 用途说明：根据ID查询信息
     * 参数说明
     * id              企业id
     * orgName        部门名称
     * 返回值说明:  系统部门框架对象
     ***********************************/
    @PostMapping("/getOrganizationById")
    @ResponseBody
    public ResponseResult getOrganizationById(String id) {
        if (StrUtil.isBlank(id)) {
            return ResponseResult.error("查询失败！");
        }
        Organization Organization = organizationService.getOrganizationById(id);
        return ResponseResult.successData(Organization);
    }




    /***********************************
     * 用途说明：设置组织是否有效
     * 参数说明
     * sysOrganization     系统组织框架对象
     * 返回值说明:  是否修改成功
     ***********************************/
    @PostMapping("/setIsValid")
    @ResponseBody
    public ResponseResult setIsValid(@RequestParam String id, @RequestParam String isvaild) {
        // 参数校验
        if (id == null || id.isEmpty() || isvaild == null || isvaild.isEmpty()) {
            return ResponseResult.error("参数不能为空");
        }
        // 校验 isvalid 的合法性（示例）
        if (!"0".equals(isvaild) && !"1".equals(isvaild)) {
            return ResponseResult.error("isvaild 参数不合法");
        }
        UpdateWrapper<Organization> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", id)
                .set("isvaild", isvaild)
                .set("lastmodifier", AuthUtils.getUser().getUserId().toString())
                .set("lastmodifydate", LocalDateTime.now());
        boolean isOk = organizationService.update(updateWrapper);
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }


    /***********************************
     * 用途说明：根据id删除系统组织框架
     * 参数说明
     * id     系统组织框架id
     * 返回值说明:  是否删除成功
     ***********************************/
    @DeleteMapping("/deleteById")
    @ResponseBody
    public ResponseResult deleteById(@RequestParam String id) {
        String[] orgIds = id.split(",");
        for (String orgId : orgIds) {
            LambdaQueryWrapper<Organization> queryWrapper =  new LambdaQueryWrapper<>();
            List<Organization> list = organizationService.list(queryWrapper.eq(Organization::getParentid, orgId));
            List<String> ids =  list.stream().map(Organization::getId).collect(Collectors.toList());
            //删除当前id及其子节点
            boolean isOk = organizationService.removeById(orgId);
            if (!isOk) {
                continue;
            }
            //删除节点
            for (String oid : ids) {
                organizationService.removeById(oid);
            }
        }
        return ResponseResult.success();
    }
}
