package org.jeecg.modules.apiService.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.jeecg.common.api.vo.Result;
import org.jeecg.config.shiro.ShiroRealm;
import org.jeecg.modules.apiBean.HttpClientUtil;
import org.jeecg.modules.apiBean.WxQrCodeVo;
import org.jeecg.modules.apiService.RecommendService;
import org.jeecg.modules.carrentConfig.entity.CarrentConfig;
import org.jeecg.modules.carrentConfig.service.ICarrentConfigService;
import org.jeecg.modules.hanHaiMember.entity.HanHaiMember;
import org.jeecg.modules.hanHaiMember.service.IHanHaiMemberService;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.annotation.Resource;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class RecommendServiceImpl implements RecommendService {

    /*************************************************************************************/
    //权限验证
    @Resource
    private ShiroRealm shiroRealm;

    //配置信息
    @Resource
    private ICarrentConfigService carrentConfigService;

    //配置信息
    @Resource
    private IHanHaiMemberService hanHaiMemberService;

    private String appid = "wx1c95690b8180a150";//小程序appid
    private String secret = "7a686fb5308cca9ac0bc8cab14130cee";//小程序密钥
    private String endpoint = "oss-cn-guangzhou.aliyuncs.com";
    private String accessKey = "LTAI5tPfZo39q2r9Sr5mW84u";
    private String secretKey = "XxExGallsV4O9nERHpVsQg2XtPCU7r";
    private String bucketName = "augcl";
    private String staticDomain = "https://img.augcl.com/";

    /*************************************************************************************/
    @Override
    public Result<?> getInviteUser(String token){
        //权限验证
        HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token);
        //返回信息
        String message = "";
        //返回数据
        Map<String, Object> map = new HashMap<>();
        
        try{
            //获取直推用户
            List<HanHaiMember> directUserList = hanHaiMemberService
                    .lambdaQuery()
                    .eq(HanHaiMember::getShareId, hanHaiMember.getId())
                    .list();
            map.put("directUserList", directUserList);

            //获取间推用户
            List<String> ids = new ArrayList<>();
            for (HanHaiMember member : directUserList) {
                ids.add(member.getId());
            }
            List<HanHaiMember> indirectUserList = hanHaiMemberService
                    .lambdaQuery()
                    .in(HanHaiMember::getShareId, ids)
                    .list();
            map.put("indirectUserList", indirectUserList);

            return Result.OK(message, map);
            
        }catch (Exception e){
            e.printStackTrace();
            return Result.OK(message, map);
        }

    }
    

    //获取个人推荐二维码
    @Override
    public Result<?> getInviteCode(String token) {
        HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token);

        //获取版本信息
        CarrentConfig vsion = carrentConfigService.lambdaQuery()
                .eq(CarrentConfig::getParamCode, "v_sion")
                .one();
        Integer vsionStr = Integer.parseInt(vsion.getParamValue());
        String trial = "release";
        if(vsionStr == 0){
            trial= "release";
        }else if(vsionStr == 1){
            trial= "trial";
        }else{
            trial= "develop";
        }

        Map<String, Object> param = new HashMap<>();
        //获取跳转路径信息
        CarrentConfig xcxSharePage = carrentConfigService.lambdaQuery()
                .eq(CarrentConfig::getParamCode, "xcxSharePage")
                .one();

        String key = "shareId=" + hanHaiMember.getId();

        param.put("path", xcxSharePage.getParamValue() + "?" + key); //跳转页面
        String accessToken = this.getAccessToken();
        RestTemplate rest = new RestTemplate();
        InputStream inputStream = null;
        OutputStream outputStream = null;
        File file = null;

        //获取存储地址
        CarrentConfig oneImage = carrentConfigService.lambdaQuery()
                .eq(CarrentConfig::getParamCode, "codeImg")
                .one();

        String codeImg = oneImage.getParamValue();
        try{
            String url = "https://api.weixin.qq.com/wxa/getwxacode?access_token=" + accessToken;
            param.put("scene", hanHaiMember.getId());
            param.put("width", 150);
            param.put("auto_color", false);
            param.put("env_version", trial);
            Map<String, Object> line_color = new HashMap<>();
            line_color.put("r", 0);
            line_color.put("g", 0);
            line_color.put("b", 0);
            param.put("line_color", line_color);
            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
            org.springframework.http.HttpEntity requestEntity = new org.springframework.http.HttpEntity(JSON.toJSONString(param), headers);
            ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
            byte[] result = entity.getBody();

            inputStream = new ByteArrayInputStream(result);
            String tempSave = codeImg;
            String filePath = tempSave;

            file = new File(filePath);
            if (!file.exists()) {
                file.createNewFile();
            }
            outputStream = new FileOutputStream(file);
            int len = 0;
            byte[] buf = new byte[1024];
            while ((len = inputStream.read(buf, 0, 1024)) != -1) {
                outputStream.write(buf, 0, len);
            }
            outputStream.flush();

            //将文件上传至阿里云
            DiskFileItemFactory factory = new DiskFileItemFactory(16, null);
            FileItem item = factory.createItem("File", "text/plain", true, file.getName());
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            try {
                FileInputStream fis = new FileInputStream(file);
                OutputStream os = item.getOutputStream();
                while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
                    os.write(buffer, 0, bytesRead);
                }
                os.close();
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            MultipartFile mf = new CommonsMultipartFile(item);
            //返回图片下载地址
            WxQrCodeVo wxCodeVo = new WxQrCodeVo();
            wxCodeVo.setUrl(staticDomain+this.uploadAliYunOss(mf));
            wxCodeVo.setName("老环卫欢迎您");
            wxCodeVo.setShareId(hanHaiMember.getId());

            return Result.OK(wxCodeVo);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //删除文件
            if (file.exists()) {
                file.delete();
            }
        }
        return null;
    }

    /**
     * 获取令牌
     *
     * @return
     */
    private String getAccessToken() {
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
        String doGet2 = HttpClientUtil.doGet2(requestUrl);
        Map<String, String> map = JSON.parseObject(doGet2, new TypeReference<Map<String, String>>() {
        });
        return map.get("access_token");
    }

    /**
     * 上传文件至阿里云oss
     *
     * @return
     */
    private String uploadAliYunOss(MultipartFile mf) throws Exception {
        String uploadFile = "WxCodeFile";
        String fileName = new StringBuffer(mf.getOriginalFilename()).append(".jpg").toString();// 获取文件名
        String dbpath = uploadFile + File.separator + fileName;
        if (dbpath.contains("\\")) {
            dbpath = dbpath.replace("\\", "/");
        }
        String endpoint = this.endpoint;
        String accessKey = this.accessKey;
        String secretKey = this.secretKey;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey);
        // 上传Byte数组。
        byte[] content = mf.getBytes();
        String bucketName = this.bucketName;
        ossClient.putObject(bucketName, dbpath, new ByteArrayInputStream(content));
        // 关闭OSSClient。
        ossClient.shutdown();
        return dbpath;
    }

}
