package com.css.txw.sso.service.yhxx.impl;

import com.css.ggzc.framework.common.pojo.CommonResult;
import com.css.ggzc.framework.common.util.gy.GyUtils;
import com.css.txw.mhzc.api.IMhzcApi;
import com.css.txw.mhzc.pojo.HtYhxxbDTO;
import com.css.txw.mhzc.pojo.YhxxReqDTO;
import com.css.txw.mhzc.pojo.YhxxbDTO;
import com.css.txw.sso.pojo.dto.session.SessionInfo;
import com.css.txw.sso.pojo.dto.session.YhInfo;
import com.css.txw.sso.pojo.vo.oauth2.OAuth2UserInfoRespVO;
import com.css.txw.sso.service.oauth2.OAuth2TokenService;
import com.css.txw.sso.service.yhxx.YhxxService;
import com.css.ggzc.framework.common.util.object.BeanUtils;
import com.css.ggzc.framework.session.SessionUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import static com.css.txw.sso.constants.SsoConstants.AUTHORIZATION_HEADER;

@Slf4j
@Service
public class YhxxServiceImpl implements YhxxService {

    @Resource
    private IMhzcApi mhzcApi;

    @Resource
    private OAuth2TokenService oauth2TokenService;

    @Override
    public SessionInfo initYhxx(String yhuuid) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setYhuuid(yhuuid);
        CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initSessionByYhuuid(yhxxReqDTO);
        YhxxbDTO data = yhxxbDTOCommonResult.getData();
        SessionInfo sessionInfo = BeanUtils.toBean(data,SessionInfo.class);
        sessionInfo.setCurrentYhuuid(data.getYhUuid());
        YhInfo yhInfo = new YhInfo();
        yhInfo.setYhuuid(data.getYhUuid());
        yhInfo.setZsxm(data.getZsxm1());
        yhInfo.setSjhm(data.getSjhm1());
        yhInfo.setSfzjhm(data.getSfzjhm());
        yhInfo.setSfzjlx(data.getSfzjlx());
        yhInfo.setYhdid(data.getDid());
        sessionInfo.setYhxx(yhInfo);
        sessionInfo.setCurrentYhlx("0");

        return sessionInfo;
    }

    @Override
    public YhxxbDTO getYhxx(String yhuuid) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setYhuuid(yhuuid);
        CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initSessionByYhuuid(yhxxReqDTO);
        YhxxbDTO data = yhxxbDTOCommonResult.getData();
        return data;
    }
    @Override
    public YhxxbDTO getYhxxByDid(String did) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setDid(did);
        CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initSessionByDid(yhxxReqDTO);
        YhxxbDTO data = yhxxbDTOCommonResult.getData();
        return data;
    }
    
    @Override
	public YhxxbDTO updateDid(YhxxbDTO yhxx) {
    	 CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.updateDid(yhxx);
         YhxxbDTO data = yhxxbDTOCommonResult.getData();
         return data;
	}

	@Override
	public YhxxbDTO intQyxxByDid(YhxxbDTO qyxx) {
    	 CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.intQyxxByDid(qyxx);
         YhxxbDTO data = yhxxbDTOCommonResult.getData();
         return data;
	}

	@Override
	public YhxxbDTO getYhxxBySfzjhm(String sfzjhm) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setSfzjhm(sfzjhm);
        CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initSessionBySfzjhm(yhxxReqDTO);
        YhxxbDTO data = yhxxbDTOCommonResult.getData();
        return data;
	}

	@Override
    public SessionInfo initYhxxByDlzh(String dlzh) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setDlzh(dlzh);
        CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initSessionByDlzh(yhxxReqDTO);
        YhxxbDTO data = yhxxbDTOCommonResult.getData();
        SessionInfo sessionInfo = new SessionInfo();
        sessionInfo.setCurrentYhuuid(data.getYhUuid());
        YhInfo yhInfo = new YhInfo();
        yhInfo.setYhuuid(data.getYhUuid());
        yhInfo.setZsxm(data.getZsxm1());
        yhInfo.setSjhm(data.getSjhm1());
        yhInfo.setSfzjhm(data.getSfzjhm());
        yhInfo.setSfzjlx(data.getSfzjlx());
        yhInfo.setYhdid(data.getDid());
        sessionInfo.setYhxx(yhInfo);
        sessionInfo.setCurrentYhlx("0");
        return sessionInfo;
    }

    @Override
    public YhxxbDTO getYhxxByDlzh(String dlzh) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setDlzh(dlzh);
        CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initSessionByDlzh(yhxxReqDTO);
        YhxxbDTO data = yhxxbDTOCommonResult.getData();
        return data;
    }

    @Override
    public SessionInfo initYhxxBySjhm(String sjhm) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setSjhm1(sjhm);
        CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initSessionByDlzh(yhxxReqDTO);
        YhxxbDTO data = yhxxbDTOCommonResult.getData();
        SessionInfo sessionInfo = BeanUtils.toBean(data, SessionInfo.class);
        return sessionInfo;
    }

    @Override
    public YhxxbDTO getYhxxBySjhm(String sjhm) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setDlzh(sjhm);
        CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initSessionByDlzh(yhxxReqDTO);
        YhxxbDTO data = yhxxbDTOCommonResult.getData();
        return data;
    }

    @Override
    public SessionInfo initAdminInfo(String yhuuid) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setYhuuid(yhuuid);
        CommonResult<HtYhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initHtSessionByYhuuid(yhxxReqDTO);
        HtYhxxbDTO data = yhxxbDTOCommonResult.getData();
        SessionInfo sessionInfo = new SessionInfo();
        sessionInfo.setCurrentYhuuid(data.getYhUuid());
        YhInfo yhInfo = new YhInfo();
        yhInfo.setYhuuid(data.getYhUuid());
        yhInfo.setZsxm(data.getZsxm1());
        yhInfo.setSjhm(data.getSjhm1());
        yhInfo.setSfzjhm(data.getSfzjhm());
        yhInfo.setSfzjlx(data.getSfzjlx());
        sessionInfo.setYhxx(yhInfo);
        sessionInfo.setCurrentYhlx("0");
        return sessionInfo;
    }

    @Override
    public HtYhxxbDTO getAdminInfo(String yhuuid) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setYhuuid(yhuuid);
        CommonResult<HtYhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initHtSessionByYhuuid(yhxxReqDTO);
        HtYhxxbDTO data = yhxxbDTOCommonResult.getData();
        return data;
    }

    @Override
    public HtYhxxbDTO getAdminInfoByDlzh(String dlzh) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setDlzh(dlzh);
        CommonResult<HtYhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initHtSessionByDlzh(yhxxReqDTO);
        HtYhxxbDTO data = yhxxbDTOCommonResult.getData();
        return data;
    }

    @Override
    public SessionInfo getSessionInfo(String yhuuid, String qyuuid) {
        YhxxReqDTO yhxxReqDTO = new YhxxReqDTO();
        yhxxReqDTO.setYhuuid(yhuuid);
        CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.initSessionByYhuuid(yhxxReqDTO);
        YhxxbDTO data = yhxxbDTOCommonResult.getData();
        SessionInfo sessionInfo = new SessionInfo();
        sessionInfo.setCurrentYhuuid(data.getYhUuid());
        YhInfo yhInfo = new YhInfo();
        yhInfo.setYhuuid(data.getYhUuid());
        yhInfo.setZsxm(data.getZsxm1());
        yhInfo.setSjhm(data.getSjhm1());
        yhInfo.setSfzjhm(data.getSfzjhm());
        yhInfo.setSfzjlx(data.getSfzjlx());
        yhInfo.setYhdid(data.getDid());
        sessionInfo.setNsrsbh(data.getNsrsbh());
        sessionInfo.setQymc(data.getQymc());
        sessionInfo.setQyuuid(data.getQyuuid());
        sessionInfo.setYhxx(yhInfo);
        sessionInfo.setCurrentYhlx("0");
        return sessionInfo;
    }


    @Override
    public OAuth2UserInfoRespVO getUserInfo(HttpServletRequest request) {
        String token = obtainAuthorization(request);
        SessionInfo sessionInfo = oauth2TokenService.checkAccessToken(token);
        if (GyUtils.isNull(sessionInfo)) throw new IllegalStateException("token无效");
        YhInfo yhxx = sessionInfo.getYhxx();
        if (GyUtils.isNull(yhxx)) throw new IllegalStateException("token无效");
        OAuth2UserInfoRespVO resp = new OAuth2UserInfoRespVO();
        resp.setYhuuid(yhxx.getYhuuid());
        resp.setZsxm(yhxx.getZsxm());
        resp.setSjhm(yhxx.getSjhm());
        resp.setYhdid(yhxx.getYhdid());
        resp.setShxydm(sessionInfo.getNsrsbh());
        resp.setQyuuid(sessionInfo.getQyuuid());
        resp.setQymc(sessionInfo.getQymc());
        resp.setYhlx(sessionInfo.getCurrentYhlx());
        log.info("getUserInfo获取:{}", resp);
        return resp;
    }

    public static String obtainAuthorization(HttpServletRequest request) {
        String authorization = request.getHeader(AUTHORIZATION_HEADER);
        if (!StringUtils.hasText(authorization)) {
            return null;
        }
        final int length = authorization.length();
        if (!authorization.startsWith("Bearer")) return null;
        return authorization.substring(length - 32);
    }

	@Override
	public YhxxbDTO saveYhxxByDid(YhxxbDTO yhxx) {
		CommonResult<YhxxbDTO> yhxxbDTOCommonResult = mhzcApi.saveYhxxByDid(yhxx);
        YhxxbDTO data = yhxxbDTOCommonResult.getData();
        return data;
	}


}
