package cn.com.ty.lift.system.user.service.impl;

import cn.com.ty.lift.common.constants.ApiConstants;
import cn.com.ty.lift.common.constants.PushMessageConstants;
import cn.com.ty.lift.common.model.PushUserInfo;
import cn.com.ty.lift.system.user.dao.mapper.IPushUserMapper;
import cn.com.xwy.boot.service.impl.BaseServiceImpl;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * @author huangyuan
 * @date 2020/4/17
 * @description
 */
@Service
public class PushUserService extends BaseServiceImpl<IPushUserMapper, PushUserInfo> {

    /**
     * @param pushSituation 推送情形:1 2 3 4 5
     *                      :1 企业管理员
     *                      :2 企业管理员 + 总经理
     *                      :3 企业管理员 + 总经理 + 区域主管
     *                      :4 企业管理员 + 总经理 + 区域主管 + 文员
     *                      :5 企业管理员 + 总经理 + 区域主管 + 文员 + 维保工
     * @return 要推送给的用户信息
     * @description 通过推送情形获取对应用户信息
     * @date 2020/4/17 11:14 上午
     */
    public List<PushUserInfo> getPushUserInfo(int pushSituation) {
        String[] roleCodes = PushMessageConstants.PUSH_VALUE_TO_ROLE_CODE.get(pushSituation);
        if (roleCodes != null && roleCodes.length > 0) {
            return getPushUserInfoByRoleCodes(Arrays.asList(roleCodes));
        }
        return null;
    }

    /**
     * @param roleCode 角色编码
     * @return 要推送的用户信息
     * @description 获取对应角色用户
     * @date 2020/5/3 10:50 上午
     */
    public List<PushUserInfo> getUserInfoByRoleCode(String roleCode) {
        //获取当前公司id
        Long companyId = getCurrentCompanyId();
        return this.baseMapper.getPushUserInfoByRoleCodes(companyId, Collections.singletonList(roleCode));
    }

    /**
     * @param
     * @return
     * @description
     * @date 2020/5/2 10:46 下午
     */
    public List<PushUserInfo> getCompanyUserInfoByRoleCode(Long companyId, String roleCode) {
        return this.baseMapper.getPushUserInfoByRoleCodes(companyId, Collections.singletonList(roleCode));
    }

    /**
     * @param companyId 指定公司id
     * @param roleCodes 角色编码集合
     * @return 用户信息
     * @description 推送消息给指定公司指定角色
     * @date 2020/5/2 10:24 下午
     */
    public List<PushUserInfo> getCompanyUserInfoByRoleCodes(Long companyId, List<String> roleCodes) {
        return this.baseMapper.getPushUserInfoByRoleCodes(companyId, roleCodes);
    }

    /**
     * @param roleCodes 角色编码集合
     * @return 要推送的用户信息
     * @description
     * @date 2020/4/17 3:38 下午
     */
    public List<PushUserInfo> getPushUserInfoByRoleCodes(List<String> roleCodes) {
        //获取当前公司id
        Long companyId = getCurrentCompanyId();
        return this.baseMapper.getPushUserInfoByRoleCodes(companyId, roleCodes);
    }

    /**
     * @param companyId 当前公司id
     * @param userId    用户id
     * @return 推送用户信息
     * @description
     * @date 2020/5/2 11:33 下午
     */
    public PushUserInfo getCompanyUserInfoByUserId(Long companyId, Long userId) {
        List<PushUserInfo> pushUserInfoList = this.baseMapper.getPushUserInfoByUserIds(companyId,
                Collections.singletonList(userId));
        if (pushUserInfoList != null && pushUserInfoList.size() > 0) {
            return pushUserInfoList.get(0);
        }
        return null;
    }

    public PushUserInfo getUserInfoByUserId(Long userId) {
        return this.baseMapper.getUserInfoByUserId(userId);
    }

    /**
     * @param userIdList 用户id集合
     * @return 用户信息
     * @description
     * @date 2020/4/18 7:16 下午
     */
    public List<PushUserInfo> getUserInfoByUserIds(List<Long> userIdList) {
        //获取当前公司id
        Long companyId = getCurrentCompanyId();
        return this.baseMapper.getPushUserInfoByUserIds(companyId, userIdList);
    }

    /**
     * @return 当前用户id
     * @description 获取当前用户id
     * @date 2020/4/17 10:06 上午
     */
    private Long getCurrentUserId() {
        return getAttributeFromRequestHead(ApiConstants.CURRENT_USER_ID);
    }


    /**
     * @return 当前公司id
     * @description 获取当前公司id
     * @date 2020/4/17 10:09 上午
     */
    private Long getCurrentCompanyId() {
        return getAttributeFromRequestHead(ApiConstants.CURRENT_COMPANY_ID);
    }


    private Long getAttributeFromRequestHead(String attributeName) {
        HttpServletRequest request = getHttpRequest();
        String attribute = request.getHeader(attributeName);
        if(StringUtils.isNotBlank(attribute)) {
            return Long.parseLong(request.getHeader(attributeName));
        }
        return null;
    }

    /**
     * @return request
     * @description 获取request
     * @date 2020/4/17 10:06 上午
     */
    private HttpServletRequest getHttpRequest() {
        return ((ServletRequestAttributes) Objects.requireNonNull(
                RequestContextHolder.getRequestAttributes())).getRequest();
    }

}
