package com.sw.mes.jip.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sw.mes.core.utils.JwtUtil;
import com.sw.mes.core.utils.StringUtils;
import com.sw.mes.jip.dto.TokenDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.*;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
import java.util.Objects;

@Configuration
@Slf4j
public class JipRestUtils {

    private static final RestTemplate restTemplate = new RestTemplate();

    public static JSONObject get(String url, Map<String, String> urlParams) {
        return get(urlToUri(url, urlParams));
    }

    //在处理企业微信某些参数时有问题
    public static JSONObject get(String url) {
        return get(URI.create(url));
    }

    private static JSONObject get(URI uri) {
        ResponseEntity<JSONObject> responseEntity = restTemplate.getForEntity(uri, JSONObject.class);
        serverIsRight(responseEntity);   //判断服务器返回状态码
        return responseEntity.getBody();
    }

    public static JSONObject post(String url, Map<String, String> urlParams, JSONObject json, TokenDto token) {
        //组装url
        return post(urlToUri(url, urlParams), json, token);
    }

    public static JSONObject post(String url, JSONObject json, TokenDto token) {
        //组装urL
        return post(URI.create(url), json, token);
    }

    private static JSONObject post(URI uri, JSONObject json, TokenDto token) {
        //组装url
        //设置提交json格式数据
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        //判断是否设置秘钥
        if (token != null && StringUtils.isNotBlank(token.getTokenKey()) && StringUtils.isNotBlank(token.getTokenPassword()))
            headers.add("Authorization", "Bearer " + JwtUtil.createJwtToken(token.getTokenKey(), token.getTokenPassword()));

        HttpEntity<JSONObject> request = new HttpEntity(json, headers);
        ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(uri, request, JSONObject.class);
        serverIsRight(responseEntity);  //判断服务器返回状态码
        return responseEntity.getBody();
    }

    private static URI urlToUri(String url, Map<String, String> urlParams) {
        //设置提交json格式数据
        UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(url);
        for (Map.Entry<String, String> entry : urlParams.entrySet()) {
            uriBuilder.queryParam((String) entry.getKey(), (String) entry.getValue());
        }
        return uriBuilder.build(true).toUri();
    }

    public static JSONObject upload(String url, MultiValueMap formParams) {
        //设置表单提交
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(formParams, headers);
        ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(url, request, JSONObject.class);
        serverIsRight(responseEntity);  //判断服务器返回状态码
        return responseEntity.getBody();
    }

    public static String download(String url, String targetPath) throws IOException {

        ResponseEntity<byte[]> rsp = restTemplate.getForEntity(url, byte[].class);
        if (rsp.getStatusCode() != HttpStatus.OK) {
            System.out.println("文件下载请求结果状态码：" + rsp.getStatusCode());
        }
        // 将下载下来的文件内容保存到本地
        Files.write(Paths.get(targetPath), Objects.requireNonNull(rsp.getBody()));
        return targetPath;

    }

    public static byte[] dowload(String url) {
        ResponseEntity<byte[]> rsp = restTemplate.getForEntity(url, byte[].class);
        return rsp.getBody();
    }

    private static void serverIsRight(ResponseEntity responseEntity) {
        if (responseEntity.getStatusCodeValue() == 200) {
        } else {
            log.error("serverIsRight_error", JSON.toJSONString(responseEntity));
            //System.out.println("服务器请求异常：{}" + responseEntity.getStatusCodeValue());
        }
    }


}