package com.reyun.saas.mob.user.service;

import com.reyun.saas.mob.user.domain.App;
import com.reyun.saas.mob.user.domain.AppAuth;
import com.reyun.saas.mob.user.domain.Channel;
import com.reyun.saas.mob.user.domain.User;
import com.reyun.saas.mob.user.dto.user.UserOutpDTO;

import java.util.List;

/**
 * @author: hanzepeng
 * @Date: 2021/09/22/16:33
 * @Description: 权限业务层
 */
public interface AuthService {

//=============  获取权限start  =================
    /**
     * 查询该用户的app
     * @param user 目标用户
     * @return
     */
    public List<App> getAppByUser(User user);


    /**
     * 查询该用户的app  包括用户已经删除的qpp
     * @param user 目标用户
     * @return
     */
    public List<App> getAppByUserIncludeDel(User user);

    /**
     * 根据用户获取一套账号下的所有app数量
     * @param user 目标用户
     * @return 数量
     */
    public Integer getRootUserAppNumByUser(User user);

    /**
     * 根据用户查询主用户
     * @param user 用户
     * @return 主用户
     */
    public User getRootParent(User user);


//=============  获取权限end  =================


//============  权限校验start  ==================


    /**
     * todo 校验当前登陆用户是否可以操作目标用户
     * @param loginUser 当前登录用户
     * @param targetUser 目标用户
     * @return 如果权限不足返回false
     */
    public boolean checkloginUserAuth(User loginUser,User targetUser);
    boolean checkloginUserAuth(Long loginUserId,String email);
    boolean checkloginUserAuth(Long loginUserId,Long targetUserId);

    /**
     * todo 校验当前登陆用户是否可以操作目标app
     * 校验逻辑:
     *   主账号/管理员 用appid查询出app  拿主账号id和app的root_parent字段比较  比较通过为有权限
     *   其他角色  以userid 和 appid 为条件去app_auth表中查询数据  查到数据为有权限
     *
     * @param user 目标用户
     * @param appId 目标app
     * @return 是否可以操作 true为可以操作  false为无法操作
     */
    public boolean checkUserAppAuth(User user,Long appId);


    /**
     * todo 校验当前登陆用户是否可以操作目标app
     * 校验逻辑:
     *   主账号/管理员 用appkey查询出app  拿主账号id和app的root_parent字段比较  比较通过为有权限
     *   其他角色  用appkey查询出app  再用userid 和 appid 为条件去app_auth表中查询数据  查到数据为有权限
     *
     * @param user 当前登录用户
     * @param appkey 目标app
     * @return 是否可以操作 true为可以操作  false为无法操作
     */
    public boolean checkUserAppAuth(User user,String appkey);

    /**
     * todo 过滤当前登陆用户没有权限的app
     * 逻辑:
     *   主要过滤逻辑是操作查询app的条件  该方法不会返回空
     *   主账号/管理员:  app表查询条件 where id in #{appids} and root_parent = #{rootParent} and del_flag is false
     *   其他角色:  app_auth表查询条件 where  user_id = #{userId} and app_id in (#{appids}) and status = 1  之后根据查出来的app权限再去查app表
     *
     * @param user 目标用户
     * @param appIds 待过滤app
     * @return 过滤后用户有权限的app集合
     */
    public List<App> filterUserAppAuthByAppId(User user, List<Long> appIds);

    /**
     * todo 过滤当前登陆用户没有权限的app
     * 逻辑:
     *   主要过滤逻辑是操作查询app的条件  该方法不会返回空
     *   主账号/管理员:  app表查询条件 where root_parent = #{rootParent} and appkey in (#{appkeys}) and del_flag is false
     *   其他角色:  app_auth表查询条件 where  user_id = #{userId} and status = 1 查询出来权限之后封装appids
     *            再去app表中 where id in (#{appAuth.appids}) and appkey in (appkeys) and del_flag is false
     *
     * @param user 目标用户
     * @param appkeys 待过滤app
     * @return 过滤后用户有权限的app集合
     */
    public List<App> filterUserAppAuthByAppkey(User user, List<String> appkeys);

    /**
     * 校验用户是否拥有产品权限
     * @param userOutpDTO 目标用户
     * @return true为拥有权限  false为没有权限
     */
    boolean isPossessAppAuth(UserOutpDTO userOutpDTO);

    /**
     * todo 校验用户渠道权限
     */
    boolean checkUserChannelAuth(User user,Long channelId);

    /**
     * todo 过滤当前登陆用户没有权限的app
     */
    List<Channel> filterUserChannelAuthByChannelId(User user,List<Long> channelIds);

//============  权限校验end  ==================



//==============  其他  ======================

    /**
     * 追加app权限
     * @param user 用户
     * @param app 要追加的app权限
     * @return
     */
    int appendAuth(User user,  App app);

    /**
     * 根据用户查询app权限
     * @param user 目标用户
     * @return 权限
     */
    List<AppAuth> findAppAuthByUser(User user);

    /**
     * 删除appauth表中的app权限
     * @param appId appid
     * @return 影响行数
     */
    int deleteAppAuth(Long appId);

    /**
     * 功能描述:查询用户的所有有操作权限子用户id，包括本用户
     */
    List<Long> getChildUserIdsAndOwn(Long userId);

    /**
     * 功能描述:查找user下的app，如果os=null则查全部平台，disable=null则查全部启用关闭状态的app
     */
    List<App> getAppByUserAndOs(User user, String os,Boolean disable);

    /**
     * 功能描述:查找user下的渠道，如果os=null则查全部平台渠道，active=null则查全部启用关闭状态的渠道
     */
    List<Channel> getChannelByUserAndOs(User user, String os,Boolean active);

}
