package com.tuoheng.admin.service.inspection.query;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.tuoheng.admin.entity.Inspection;
import com.tuoheng.admin.entity.User;
import com.tuoheng.admin.enums.UserTypeEnum;
import com.tuoheng.admin.enums.code.inspection.QueryInspectionListServiceEnum;
import com.tuoheng.admin.enums.code.inspectionfile.ListByDeptUserTypeEnum;
import com.tuoheng.admin.mapper.InspectionMapper;
import com.tuoheng.admin.mapper.UserMapper;
import com.tuoheng.admin.query.InspectionFileQuery;
import com.tuoheng.admin.vo.InspectionListVo;
import com.tuoheng.common.core.enums.ServiceExceptionEnum;
import com.tuoheng.common.core.exception.ServiceException;
import com.tuoheng.common.core.utils.JsonResult;
import com.tuoheng.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Stream;

/**
 * @Author ChengWang
 * @Date 2022/12/2
 */
@Service
@Slf4j
public class QueryNewInspectionListService {

    @Autowired
    private InspectionMapper inspectionMapper;

    @Autowired
    private UserMapper userMapper;



    public JsonResult getList() {
        //获取登录用户信息
        //String username = SecurityUserUtils.username();
        String username = "admin";
        if(StringUtils.isEmpty(username)){
            JsonResult.error(ListByDeptUserTypeEnum.USER_NAME_IS_NULL.getCode(),ListByDeptUserTypeEnum.USER_NAME_IS_NULL.getMsg());
        }
        User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
                .eq(User::getUsername, username).eq(User::getMark, 1));
        if(ObjectUtil.isNull(user)){
            JsonResult.error(ListByDeptUserTypeEnum.USER_IS_NULL.getCode(),ListByDeptUserTypeEnum.USER_IS_NULL.getMsg());
        }
        String tenantId = user.getTenantId();
        if(StringUtils.isEmpty(tenantId)){
            JsonResult.error(ListByDeptUserTypeEnum.TENANT_ID_IS_NULL.getCode(),ListByDeptUserTypeEnum.TENANT_ID_IS_NULL.getMsg());
        }

        //判断用户角色 1超级管理员 2部门管理员 3普通用户
        if(null == user.getType()){
            throw new ServiceException(ServiceExceptionEnum.PARAMETER_IS_NULL);
        }
        //若角色为超级管理员，查询任务表最新五条数据
        if(UserTypeEnum.SUPER_ADMIN.getCode()==user.getType()) {
            List<Inspection> inspectionList = inspectionMapper.selectList(Wrappers.<Inspection>lambdaQuery()
                    .eq(Inspection::getTenantId, tenantId)
                    .eq(Inspection::getMark, 1)
                    .orderByDesc(Inspection::getCreateTime)
                    .last("limit 5"));
            if (inspectionList == null) {
                throw new ServiceException(ServiceExceptionEnum.PARAMETER_IS_NULL);
            }
            if (UserTypeEnum.SUPER_ADMIN.getCode() == user.getType() || UserTypeEnum.ORDINARY_USER.getCode() == user.getType()) {
                Stream<InspectionListVo> inspections = this.getInspectionListVoStream(inspectionList);

                return JsonResult.success(inspections);

            }
        }


        //若角色为部门管理员或普通用户，查询最新五条数据
        if(UserTypeEnum.ADMIN.getCode()==user.getType() || UserTypeEnum.ORDINARY_USER.getCode()==user.getType()){
            String deptId = user.getDeptId();
            if(StringUtils.isEmpty(deptId)){
                JsonResult.error(QueryInspectionListServiceEnum.DEPT_ID_IS_NULL.getCode(),QueryInspectionListServiceEnum.DEPT_ID_IS_NULL.getMsg());
            }
            List<Inspection> inspectionList = inspectionMapper.selectList(new LambdaQueryWrapper<Inspection>()
                    .eq(Inspection::getTenantId, tenantId)
                    .eq(Inspection::getDeptId, deptId)
                    .eq(Inspection::getMark, 1)
                    .orderByDesc(Inspection::getCreateTime)
                    .last("limit 5"));
            if(inspectionList==null){
                throw new ServiceException(ServiceExceptionEnum.PARAMETER_IS_NULL);
            }
            Stream<InspectionListVo> inspectionListVoStream = this.getInspectionListVoStream(inspectionList);

            return JsonResult.success(inspectionListVoStream);

        }

        return JsonResult.error();
    }

    private Stream<InspectionListVo> getInspectionListVoStream(List<Inspection> inspectionList) {
        return inspectionList.stream().map(x -> {
                    InspectionListVo vo = new InspectionListVo();
                    BeanUtils.copyProperties(x, vo);
                    return vo;
                });

    }
}
