package com.zt.plat.module.qms.resource.record.service.recordpermission;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.module.qms.resource.record.controller.admin.recordpermission.vo.RecordPermissionPageReqVO;
import com.zt.plat.module.qms.resource.record.controller.admin.recordpermission.vo.RecordPermissionRespVO;
import com.zt.plat.module.qms.resource.record.controller.admin.recordpermission.vo.RecordPermissionSaveReqVO;
import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordJoinPermissionRespVO;
import com.zt.plat.module.qms.resource.record.controller.admin.recordrecord.vo.RecordRecordPageReqVO;
import com.zt.plat.module.qms.resource.record.dal.dataobject.recordpermission.RecordPermissionDO;
import jakarta.validation.Valid;

import java.util.List;

/**
 * 记录权限 Service 接口
 *
 * @author 后台管理
 */
public interface RecordPermissionService {

    /**
     * 创建记录权限
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    RecordPermissionRespVO createRecordPermission(@Valid RecordPermissionSaveReqVO createReqVO);

    /**
     * 更新记录权限
     *
     * @param updateReqVO 更新信息
     */
    void updateRecordPermission(@Valid RecordPermissionSaveReqVO updateReqVO);

    /**
     * 删除记录权限
     *
     * @param id 编号
     */
    void deleteRecordPermission(Long id);

    /**
    * 批量删除记录权限
    *
    * @param ids 编号
    */
    void deleteRecordPermissionListByIds(List<Long> ids);

    /**
     * 获得记录权限
     *
     * @param id 编号
     * @return 记录权限
     */
    RecordPermissionDO getRecordPermission(Long id);

    /**
     * 获得记录权限分页
     *
     * @param pageReqVO 分页查询
     * @return 记录权限分页
     */
    PageResult<RecordPermissionDO> getRecordPermissionPage(RecordPermissionPageReqVO pageReqVO);

    List<RecordPermissionDO> selectAllListBySourceId(RecordPermissionDO recordPermissionDO);

//    List<RecordPermissionDO> selectRecordPermission(RecordPermissionDO recordPermissionDO);

    // 批量查询
    int insertOrUpdateRecordPermissionBatch(List<RecordPermissionDO> recordPermissionDO);

    List<RecordPermissionDO> selectList(LambdaQueryWrapper<RecordPermissionDO> lambdaQueryWrapper);


    /**
     * 通过分类Id 获取满足当前用户的权限列表
     * @param
     * @return
     */
    List<RecordPermissionDO> selectPermissionList(RecordPermissionDO recordPermissionDO);

    // 检查用户是否有记录的权限,返回权限列表
    List<RecordPermissionDO> selectRecordPermissionList();

    /**
     * 判断当前分类是否有管理员权限
     * @param categoryId
     * @return
     */

    boolean hasAdminPermissionByCategoryId(Long categoryId);

    /**
     * 判断当前用户是最高管理员
     * @return
     */
    boolean judgeIsSuperAdmin();

    /**
     * 获取权限列表
     * @param parentCategoryId
     * @return
     */
    List<RecordPermissionDO> getMatchedPermissionList(Long parentCategoryId);

    /**
     * 获取当前用户所在的部门以及父部门
     * @return
     */
    List<Long> getParentDepts();

    boolean hasEditPermissionByUserId(Long categoryId);

//    boolean updateRecordPermissionBatch(List<RecordPermissionDO> recordPermissionDOList);

    Integer updatePermission(LambdaUpdateWrapper<RecordPermissionDO> queryWrapper);

    Integer withdrawPermissionJob();

    IPage<RecordJoinPermissionRespVO> selectRecordByPermission(RecordPermissionPageReqVO pageReqVO);

    IPage<RecordJoinPermissionRespVO> selectPermissionByRecord(RecordRecordPageReqVO pageReqVO);

    boolean insertBatch(List<RecordPermissionDO> toInsert);

    boolean updateBatch(List<RecordPermissionDO> toUpdate);
}