package com.jy.system.dao;

import com.jy.framework.model.base.BaseDao;
import com.jy.framework.model.base.BaseIdPo;
import com.jy.framework.model.constants.CommonConstant;
import com.jy.system.mapper.SysDeptMapper;
import com.jy.system.model.dto.SysDeptSelectDto;
import com.jy.system.model.entity.SysDept;
import com.jy.system.model.table.SysDeptTable;
import com.jy.system.model.vo.SysDeptVo;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SysDeptDao extends BaseDao<SysDeptMapper, SysDept> {

    /**
     * 部门列表
     */
    public List<SysDeptVo> getList(SysDeptSelectDto dto) {
        SysDeptTable sd = SysDeptTable.sd;

        return sql(SysDeptVo.class)
                .select(
                        sd.id,
                        sd.parentId,
                        sd.name,
                        sd.code,
                        sd.status,
                        sd.sort,
                        sd.remark
                )
                .from(sd)
                .where(
                        sd.status.eq(dto.getStatus()),
                        sd.name.like(dto.getName())
                )
                .orderBy(
                        sd.sort.asc(),
                        sd.id.asc()
                )
                .list();
    }

    /**
     * 部门详情
     */
    public SysDeptVo getDetail(Long id) {
        SysDeptTable sd = SysDeptTable.sd;

        return sql(SysDeptVo.class)
                .select(
                        sd.id,
                        sd.parentId,
                        sd.name,
                        sd.code,
                        sd.status,
                        sd.sort,
                        sd.remark
                )
                .from(sd)
                .where(sd.id.eq(id))
                .one();
    }

    /**
     * 部门编码是否存在
     */
    public boolean codeExists(String code) {
        return lambdaQuery().eq(SysDept::getCode, code).exists();
    }

    /**
     * 同级部门名称是否存在
     */
    public boolean peerDeptExists(Long parentId, String name) {
        return lambdaQuery().eq(SysDept::getParentId, parentId).eq(SysDept::getName, name).exists();
    }

    /**
     * 同级部门名称是否存在（排除id）
     */
    public boolean peerDeptExists(Long parentId, String name, Long exclusionId) {
        return lambdaQuery().eq(SysDept::getParentId, parentId).eq(SysDept::getName, name)
                .ne(BaseIdPo::getId, exclusionId).exists();
    }

    /**
     * 子部门是否存在
     */
    public boolean childrenExists(Long id) {
        return lambdaQuery().eq(SysDept::getParentId, id).exists();
    }

    /**
     * 启用状态的子部门是否存在
     */
    public boolean childrenEnableExists(Long id) {
        return lambdaQuery().eq(SysDept::getParentId, id).eq(SysDept::getStatus, CommonConstant.ENABLE).exists();
    }

    /**
     * 更新祖级列表
     */
    public void updateAncestors(String oldChildrenAncestors, String newChildrenAncestors) {
        lambdaUpdate()
                .likeRight(SysDept::getAncestors, oldChildrenAncestors)
                .setSql("ancestors = REPLACE(ancestors, {0}, {1})", oldChildrenAncestors, newChildrenAncestors)
                .update(new SysDept());
    }

    /**
     * 获取子部门id列表
     */
    public List<Long> getChildrenIdList(Long id) {
        SysDeptTable sd = SysDeptTable.sd;
        return sql(Long.class)
                .select(sd.id)
                .from(sd)
                .where(_findInSet(id, sd.ancestors))
                .list();
    }

}
