package cn.hellohao.controller;

import cn.hellohao.pojo.*;
import cn.hellohao.service.*;
import cn.hellohao.service.impl.*;
import cn.hellohao.utils.*;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author Hellohao
 * @version 1.0
 * @date 2019-07-18 17:22
 */
@RestController
public class ClientController {
    @Autowired
    private NOSImageupload nOSImageupload;
    @Autowired
    private UserService userService;
    @Autowired
    private KeysService keysService;
    @Autowired
    private OSSImageupload ossImageupload;
    @Autowired
    private ConfigService configService;
    @Autowired
    private USSImageupload ussImageupload;
    @Autowired
    private KODOImageupload kodoImageupload;
    @Autowired
    private UploadConfigService uploadConfigService;
    @Autowired
    private NoticeService noticeService;
    @Autowired
    private COSImageupload cosImageupload;
    @Autowired
    private FTPImageupload ftpImageupload;
    @Autowired
    private DomainService domainService;
    @Autowired
    private ImgService imgService;

    @Value("${systemupdate}")
    private String systemupdate;

    @PostMapping(value = "/clientupimg")
    @ResponseBody
    public ResultBean clientupimg(HttpServletRequest request,@RequestParam("file") List<MultipartFile> file, String email, String pass) throws Exception {
        String userip = GetIPS.getIpAddr(request);
        Print.Normal("上传者ip:"+userip);
        ResultBean resultBean = null;
        JSONArray jsonArray = new JSONArray();
        UploadConfig uploadConfig = uploadConfigService.getUpdateConfig();
        if (uploadConfig.getApi() == 1) {
            if (email != null && pass != null) {
                Integer ret = userService.login(email, Base64Encryption.encryptBASE64(pass.getBytes()),null);
                if (ret > 0) {
                    User user = userService.getUsers(email);
                    if (user.getIsok() == 1) {
                        User u = userService.getUsers(email);
                        Config config = configService.getSourceype();//查询当前系统使用的存储源类型。

                        Integer Sourcekey = GetCurrentSource.GetSource(u.getId());

                        Keys key = keysService.selectKeys(Sourcekey);
                        if (key.getStorageType() != 0 && key.getStorageType() != null) {
                            if (key.getStorageType() == 1) {
                                nOSImageupload.Initialize(key);//实例化网易
                            } else if (key.getStorageType() == 2) {
                                OSSImageupload.Initialize(key);
                            } else if (key.getStorageType() == 3 || key.getStorageType()==8) {
                                USSImageupload.Initialize(key);
                            } else if (key.getStorageType() == 4) {
                                KODOImageupload.Initialize(key);
                            } else if (key.getStorageType() == 6) {
                                COSImageupload.Initialize(key);
                            } else if (key.getStorageType() == 7) {
                                FTPImageupload.Initialize(key);
                            } else {
                                System.err.println("客户端:未获取到对象存储参数,初始化失败。");
                            }
                        }
                        Print.Normal("客户端:初始化上传。");
                        Boolean b = false;
                        if (Sourcekey == 5) {
                            b = true;
                        } else {
                            b = StringUtils.doNull(Sourcekey, key);//判断对象是否有空值
                        }
                        if (b) {
                            long stime = System.currentTimeMillis();
                            String userpath = "tourist";
                            if (uploadConfig.getUrltype() == 2) {
                                java.text.DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
                                userpath = dateFormat.format(new Date());
                            } else {
                                if (u != null) {
                                    userpath = u.getUsername();
                                }
                            }
                            Map<String, MultipartFile> map = new HashMap<>();
                            for (MultipartFile multipartFile : file) {
                                //获取文件名
                                String fileName = multipartFile.getOriginalFilename();
                                String lastname = fileName.substring(fileName.lastIndexOf(".") + 1);//获取文件后缀
                                if (!multipartFile.isEmpty()) { //判断文件是否为空
                                    map.put(lastname, multipartFile);
                                }
                            }
                            Map<ReturnImage, Integer> m = null;
                            Map<ReturnImage, Integer> m2 = null;
                            if (key.getStorageType() == 1) {
                                m = nOSImageupload.clientuploadNOS(map, userpath, uploadConfig);
                            } else if (key.getStorageType() == 2) {
                                m = ossImageupload.clientuploadOSS(map, userpath, uploadConfig);
                            } else if (key.getStorageType() == 3 || key.getStorageType()==8) {
                                m = ussImageupload.clientuploadUSS(map, userpath, uploadConfig);
                            } else if (key.getStorageType() == 4) {
                                m = kodoImageupload.clientuploadKODO(map, userpath, uploadConfig);
                            } else if (key.getStorageType() == 5) {
                                m2 = LocUpdateImg.clientLocUpdateImg(map, userpath, uploadConfig);
                            } else if (key.getStorageType() == 6) {
                                m = cosImageupload.clientuploadCOS(map, userpath, uploadConfig);
                            } else if (key.getStorageType() == 7) {
                                m = ftpImageupload.clientuploadFTP(map, userpath, uploadConfig);
                            } else {
                                System.err.println("未获取到对象存储参数,上传失败。");
                            }
                            Images img = new Images();
                            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                            String times = df.format(new Date());
                            System.out.println("上传图片的时间是:" + times);
                            if (key.getStorageType() == 5) {
                                for (Map.Entry<ReturnImage, Integer> entry : m2.entrySet()) {
                                    JSONObject jsonObject = new JSONObject();
                                    jsonObject.put("Imgname", entry.getKey().getImgname());
                                    if (key.getStorageType() == 5) {
                                        if (config.getDomain() != null) {
                                            jsonObject.put("Imgurl", config.getDomain() + "/" + entry.getKey().getImgurl());
                                            img.setImgurl(config.getDomain() + "/" + entry.getKey().getImgurl());//图片链接
                                        } else {
                                            jsonObject.put("Imgurl", config.getDomain() + "/" + entry.getKey().getImgurl());
                                            img.setImgurl("http://" + IPPortUtil.getLocalIP() + ":" + IPPortUtil.getLocalPort() + "/" + entry.getKey().getImgurl());//图片链接
                                        }
                                    } else {
                                        jsonObject.put("Imgname", entry.getKey().getImgurl());
                                        img.setImgurl(entry.getKey().getImgurl());//图片链接
                                    }
                                    img.setUpdatetime(times);
                                    img.setSource(key.getStorageType());
                                    if (u == null) {
                                        img.setUserid(0);//用户id
                                    } else {
                                        img.setUserid(u.getId());//用户id
                                    }
                                    img.setSizes((entry.getValue()));
                                    img.setImgname(SetText.getSubString(entry.getKey().getImgurl(), key.getRequestAddress() + "/", ""));
                                    img.setAbnormal(userip);
                                    img.setImgtype(0);
                                    //-1证明超出大小,
                                    if (entry.getValue() != -1) {
                                        userService.insertimg(img);
                                    }
                                    long etime = System.currentTimeMillis();
                                    System.out.println("上传图片所用时长:" + String.valueOf(etime - stime) + "ms");
                                    jsonArray.add(jsonObject);
                                }
                            } else {
                                for (Map.Entry<ReturnImage, Integer> entry : m.entrySet()) {
                                    JSONObject jsonObject = new JSONObject();
                                    jsonObject.put("Imgname", entry.getKey().getImgname());
                                    if (key.getStorageType() == 5) {
                                        if (config.getDomain() != null) {
                                            jsonObject.put("Imgurl", config.getDomain() + "/" + entry.getKey().getImgurl());
                                            img.setImgurl(config.getDomain() + "/" + entry.getKey().getImgurl());//图片链接
                                        } else {
                                            jsonObject.put("Imgurl", config.getDomain() + "/" + entry.getKey().getImgurl());
                                            img.setImgurl("http://" + IPPortUtil.getLocalIP() + ":" + IPPortUtil.getLocalPort() + "/" + entry.getKey().getImgurl());//图片链接
                                        }
                                    } else {
                                        jsonObject.put("Imgurl", entry.getKey().getImgurl());
                                        img.setImgurl(entry.getKey().getImgurl());//图片链接
                                    }
                                    img.setUpdatetime(times);
                                    img.setSource(key.getStorageType());
                                    if (u == null) {
                                        img.setUserid(0);//用户id
                                    } else {
                                        img.setUserid(u.getId());//用户id
                                    }
                                    img.setSizes((entry.getValue())/1024);
                                    img.setImgname(SetText.getSubString(entry.getKey().getImgurl(), key.getRequestAddress() + "/", ""));
                                    img.setAbnormal(userip);
                                    img.setImgtype(0);
                                    //-1证明超出大小,
                                    if (entry.getValue() != -1) {
                                        userService.insertimg(img);
                                    }
                                    long etime = System.currentTimeMillis();
                                    System.out.println("上传图片所用时长:" + String.valueOf(etime - stime) + "ms");
                                    jsonArray.add(jsonObject);
                                }
                            }
                            resultBean = ResultBean.success(jsonArray);
                        } else {resultBean = ResultBean.error(-1, "服务器内部错误,请联系管理员");}
                    }
                } else {resultBean = ResultBean.error(-2, "此用户信息不正确。");}
            } else {resultBean = ResultBean.error(-3, "邮箱密码为空");}
        }
        else{resultBean = ResultBean.error(-4, "管理员关闭了API接口");}
        return resultBean;
    }

    @PostMapping(value = "/clientupurlimg")
    @ResponseBody
    public ResultBean clientupurlimg( String imgurl, HttpServletRequest request, Integer setday,
                           String email,String pass) throws Exception {
        String userip = GetIPS.getIpAddr(request);
        Print.Normal("上传者ip:"+userip);
        ResultBean resultBean = null;
        UploadConfig uploadConfig = uploadConfigService.getUpdateConfig();
        if (uploadConfig.getApi() == 1) {
            if (email != null && pass != null) {
                Integer ret = userService.login(email, Base64Encryption.encryptBASE64(pass.getBytes()),null);
                if (ret > 0) {
                    User u = userService.getUsers(email);
                    Config config = configService.getSourceype();//查询当前系统使用的存储源类型。
                    Integer usermemory =0;
                    Integer memory =0;
                    Integer Sourcekey=0;
                    if(u==null){
                        Sourcekey = GetCurrentSource.GetSource(null);
                        memory = uploadConfig.getVisitormemory();
                        usermemory= imgService.getusermemory(0);
                        if(usermemory==null){usermemory = 0;}
                    }else{
                        Sourcekey = GetCurrentSource.GetSource(u.getId());
                        memory = userService.getUsers(u.getEmail()).getMemory();
                        usermemory= imgService.getusermemory(u.getId());
                        if(usermemory==null){usermemory = 0;}
                    }
                    String userpath = "tourist";
                    if(uploadConfig.getUrltype()==2){
                        java.text.DateFormat dateFormat = new java.text.SimpleDateFormat("yyyy/MM/dd");
                        userpath = dateFormat.format(new Date());
                    }else{if (u != null) { userpath = u.getUsername();}}
                    JSONArray jsonArray = new JSONArray();

                    Keys key = keysService.selectKeys(Sourcekey);
                    long imgsize = ImgUrlUtil.getFileLength(imgurl);
                    Integer youke = uploadConfig.getFilesizetourists();
                    Integer yonghu = uploadConfig.getFilesizeuser();
                    String uuid= UUID.randomUUID().toString().replace("-", "");
                    Boolean bo =false;
                    if(Sourcekey==5){
                        bo =true;
                    }else{bo = StringUtils.doNull(Sourcekey,key);//判断对象是否有空值
                    }
//        //容量判断
                    if(u==null){
                        memory = uploadConfig.getVisitormemory();
                        usermemory= imgService.getusermemory(0);
                        if(usermemory==null){usermemory = 0;}
                    }else{
                        memory = userService.getUsers(u.getEmail()).getMemory();
                        usermemory= imgService.getusermemory(u.getId());
                        if(usermemory==null){usermemory = 0;}
                    }
                    Print.warning("上传地址是:"+request.getSession().getServletContext().getRealPath("/")+"/hellohaotmp/");
                    if(bo){
                        if(usermemory/1024<memory){
                            long stime = System.currentTimeMillis();
                            if(u!=null){
                                if(imgsize>0 && imgsize<=(yonghu*1024*1024)){
                                    try{
                                        boolean bl =ImgUrlUtil.downLoadFromUrl(imgurl,
                                                uuid, request.getSession().getServletContext().getRealPath("/")+"/hellohaotmp/");
                                        if(bl==true){
                                            FileInputStream is = new FileInputStream(request.getSession().getServletContext().getRealPath("/")+"/hellohaotmp/"+uuid);
                                            byte[] b = new byte[3];
                                            is.read(b, 0, b.length);
                                            String xxx = ImgUrlUtil.bytesToHexString(b);
                                            xxx = xxx.toUpperCase();
                                            String ooo = TypeDict.checkType(xxx);
                                            if(is!=null){
                                                is.close();
                                            }
                                            if(!ooo.equals("0000")){
                                                Map<String, String> map = new HashMap<>();
                                                map.put(ooo, request.getSession().getServletContext().getRealPath("/")+"/hellohaotmp/"+uuid);
                                                Map<ReturnImage, Integer> m = null;
                                                if(key.getStorageType()==1){
                                                    m = nOSImageupload.Imageupload(null, userpath,map,setday);
                                                }else if (key.getStorageType()==2){
                                                    m = ossImageupload.ImageuploadOSS(null, userpath,map,setday);
                                                }else if(key.getStorageType()==3 || key.getStorageType()==8){
                                                    m = ussImageupload.ImageuploadUSS(null, userpath,map,setday);
                                                }else if(key.getStorageType()==4){
                                                    m = kodoImageupload.ImageuploadKODO(null, userpath,map,setday);
                                                }else if(key.getStorageType()==5){
                                                    m = LocUpdateImg.ImageuploadLOC(null,userpath,map,setday);
                                                }else if(key.getStorageType()==6){
                                                    m = cosImageupload.ImageuploadCOS(null,userpath,map,setday);
                                                }else if(key.getStorageType()==7){
                                                    m =  ftpImageupload.ImageuploadFTP(null,userpath,map,setday);
                                                }
                                                else{
                                                    System.err.println("未获取到对象存储参数,上传失败。");
                                                }
                                                Images img = new Images();
                                                SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
                                                String times = df.format(new Date());
                                                System.out.println("上传图片的时间是:"+times);
                                                for (Map.Entry<ReturnImage, Integer> entry : m.entrySet()) {
                                                    if(key.getStorageType()==5){
                                                        if(config.getDomain()!=null){
                                                            jsonArray.add(config.getDomain()+"/links/"+entry.getKey().getImgurl());
                                                            img.setImgurl(config.getDomain()+"/links/"+entry.getKey().getImgurl());//图片链接
                                                        }else{
                                                            jsonArray.add(config.getDomain()+"/links/"+entry.getKey().getImgurl());
                                                            img.setImgurl("http://"+IPPortUtil.getLocalIP()+":"+IPPortUtil.getLocalPort()+"/links/"+entry.getKey().getImgurl());//图片链接
                                                        }
                                                    }else{
                                                        jsonArray.add(entry.getKey().getImgurl());
                                                        img.setImgurl(entry.getKey().getImgurl());
                                                    }
                                                    img.setUpdatetime(times);
                                                    img.setSource(key.getStorageType());
                                                    if (u == null) {
                                                        img.setUserid(0);
                                                    } else {
                                                        img.setUserid(u.getId());
                                                    }
                                                    img.setSizes((entry.getValue()));
                                                    img.setImgname(SetText.getSubString(entry.getKey().getImgurl(), key.getRequestAddress() + "/", ""));
                                                    img.setAbnormal(userip);
                                                    img.setImgtype(0);
                                                    userService.insertimg(img);
                                                    long etime = System.currentTimeMillis();
                                                    System.out.println("上传图片所用时长:" + String.valueOf(etime - stime) + "ms");
                                                }
                                                resultBean = ResultBean.success(jsonArray);
                                            }else{
                                                resultBean = ResultBean.error(-3,"文件类型不符合要求");
                                            }
                                        }
                                    }catch (Exception e) {
                                        // TODO: handle exception
                                        Print.warning(e.toString());
                                        resultBean = ResultBean.error(-4,"该文件不支持上传");
                                    }
                                }else{
                                    resultBean = ResultBean.error(-2,"文件过大");
                                }
                            }else{
                                if(imgsize>0 && imgsize<=(youke*1024*1024)){
                                    try{
                                        boolean bl = ImgUrlUtil.downLoadFromUrl(imgurl,
                                                uuid, request.getSession().getServletContext().getRealPath("/")+"/hellohaotmp/");
                                        if(bl==true){
                                            FileInputStream is = new FileInputStream(request.getSession().getServletContext().getRealPath("/")+"/hellohaotmp/"+uuid);
                                            byte[] b = new byte[3];
                                            is.read(b, 0, b.length);
                                            String xxx = ImgUrlUtil.bytesToHexString(b);
                                            xxx = xxx.toUpperCase();
                                            String ooo = TypeDict.checkType(xxx);
                                            if(is!=null){
                                                is.close();
                                            }
                                            if(!xxx.equals("0000")){
                                                Map<String, String> map = new HashMap<>();
                                                map.put(ooo, request.getSession().getServletContext().getRealPath("/")+"/hellohaotmp/"+uuid);
                                                Map<ReturnImage, Integer> m = null;
                                                if(key.getStorageType()==1){
                                                    m = nOSImageupload.Imageupload(null, userpath,map,setday);
                                                }else if (key.getStorageType()==2){
                                                    m = ossImageupload.ImageuploadOSS(null, userpath,map,setday);
                                                }else if(key.getStorageType()==3 || key.getStorageType()==8){
                                                    m = ussImageupload.ImageuploadUSS(null, userpath,map,setday);
                                                }else if(key.getStorageType()==4){
                                                    m = kodoImageupload.ImageuploadKODO(null, userpath,map,setday);
                                                }else if(key.getStorageType()==5){
                                                    m =LocUpdateImg.ImageuploadLOC(null,userpath, map,setday);
                                                }else if(key.getStorageType()==6){
                                                    m =cosImageupload.ImageuploadCOS(null,userpath, map,setday);
                                                }else if(key.getStorageType()==7){
                                                    m =  ftpImageupload.ImageuploadFTP(null,userpath,map,setday);
                                                }
                                                else{
                                                    System.err.println("未获取到对象存储参数,上传失败。");
                                                }
                                                Images img = new Images();
                                                SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
                                                String times = df.format(new Date());
                                                System.out.println("上传图片的时间是:"+times);
                                                for (Map.Entry<ReturnImage, Integer> entry : m.entrySet()) {
                                                    if(key.getStorageType()==5){
                                                        if(config.getDomain()!=null){
                                                            jsonArray.add(config.getDomain()+"/links/"+entry.getKey().getImgurl());
                                                            img.setImgurl(config.getDomain()+"/links/"+entry.getKey().getImgurl());//图片链接
                                                        }else{
                                                            jsonArray.add(config.getDomain()+"/links/"+entry.getKey().getImgurl());
                                                            img.setImgurl("http://"+IPPortUtil.getLocalIP()+":"+IPPortUtil.getLocalPort()+"/links/"+entry.getKey().getImgurl());//图片链接
                                                        }
                                                    }else{
                                                        jsonArray.add(entry.getKey().getImgurl());
                                                        img.setImgurl(entry.getKey().getImgurl());//图片链接
                                                    }
                                                    img.setUpdatetime(times);
                                                    img.setSource(key.getStorageType());
                                                    if (u == null) {
                                                        img.setUserid(0);//用户id
                                                    } else {
                                                        img.setUserid(u.getId());//用户id
                                                    }
                                                    img.setSizes((entry.getValue()));
                                                    img.setImgname(SetText.getSubString(entry.getKey().getImgurl(), key.getRequestAddress() + "/", ""));
                                                    img.setAbnormal(userip);
                                                    img.setImgtype(0);
                                                    userService.insertimg(img);
                                                    long etime = System.currentTimeMillis();
                                                    System.out.println("上传图片所用时长:" + String.valueOf(etime - stime) + "ms");
                                                }
                                                resultBean = ResultBean.success(jsonArray);
                                            }else{
                                                resultBean = ResultBean.error(-3,"文件类型不符合要求");
                                            }
                                        }
                                    }catch (Exception e) {
                                        // TODO: handle exception
                                        Print.warning(e.toString());
                                        resultBean = ResultBean.error(-4,"文件类型不符合要求");
                                    }
                                }else{
                                    resultBean = ResultBean.error(-2,"图片太大或不存在");
                                }
                            }
                        }else{
                            resultBean = ResultBean.error(-5,"可用空间不足");
                        }
                    }else{
                        resultBean = ResultBean.error(-1,"未配置存储源");
                    }
                }else {resultBean = ResultBean.error(-2, "此用户信息不正确。");}
            }else {resultBean = ResultBean.error(-3, "邮箱或密码为空");}
        }else{resultBean = ResultBean.error(-4, "管理员关闭了API接口");}
Print.Normal(resultBean.toString());
        return resultBean;
/**
 * 错误返回值含义:
 * -1 存储源key未配置
 * -2 目标图片太大或者不存在
 * -3 文件类型不符合要求
 * */
    }

    @RequestMapping("/clientlogin")
    @ResponseBody
    public String login( HttpSession httpSession, String email, String password) {
        JSONArray jsonArray = new JSONArray();
        String basepass = Base64Encryption.encryptBASE64(password.getBytes());
        Integer ret = userService.login(email, basepass,null);
        if (ret > 0) {
            User user = userService.getUsers(email);
            if (user.getIsok() == 1) {
                jsonArray.add(1);
            } else if(ret==-1){
                jsonArray.add(-1);
            }else {
                jsonArray.add(-2);
            }
        } else {
            jsonArray.add(0);
        }
        return jsonArray.toString();
    }

    @GetMapping (value = "/notices")
    @ResponseBody
    public String notices() throws Exception {
        return "-1";//-1就是没有公告,客户端不显示
    }

    @GetMapping("/getNotice")
    @ResponseBody
    public Msg getNotice() {
        Msg msg = new Msg();
        String url = "http://tc.hellohao.cn/getNoticeText";
        if(TestUrl.testUrlWithTimeOut(url,2000)){
            String urls =url;
            msg.setData(HttpUtil.get(urls));
        }else{
            msg.setData("暂无公告");
        }
        return msg;
    }




}