package com.huiju.estateagents.third.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.huiju.estateagents.base.BaseController;
import com.huiju.estateagents.base.ResponseBean;
import com.huiju.estateagents.common.StringUtils;
import com.huiju.estateagents.common.WxUtils;
import com.huiju.estateagents.third.entity.TaMpInfo;
import com.huiju.estateagents.third.service.ITaMpInfoService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.bean.material.WxMpMaterial;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>
    *   前端控制器
    * </p>
 *
 * @author fxf
 * @since 2020-06-02
 */
@Slf4j
@RestController
@RequestMapping("/api")
public class TaMpInfoController extends BaseController {

    @Autowired
    public ITaMpInfoService iTaMpInfoService;

    @Autowired
    private WxUtils wxUtils;

//
//    /**
//     * 分页查询列表
//     * @param pageNum
//     * @param pageSize
//     * @return
//     */
//    @RequestMapping(value="/taMpInfo",method= RequestMethod.GET)
//    public ResponseBean taMpInfoList(@RequestParam(value ="pageNum",defaultValue = "1") Integer pageNum,
//                                     @RequestParam(value ="pageSize",defaultValue = "10") Integer pageSize){
//        ResponseBean responseBean = new ResponseBean();
//        try {
//            //使用分页插件
//		    IPage<TaMpInfo> pg = new Page<>(pageNum, pageSize);
//            QueryWrapper<TaMpInfo> queryWrapper = new QueryWrapper<>();
//            queryWrapper.orderByDesc("create_date");
//
//            IPage<TaMpInfo> result = iTaMpInfoService.page(pg, queryWrapper);
//            responseBean.addSuccess(result);
//        }catch (Exception e){
//            e.printStackTrace();
//            logger.error("taMpInfoList -=- {}",e.toString());
//            responseBean.addError(e.getMessage());
//        }
//        return responseBean;
//    }
//
//    /**
//     * 保存对象
//     * @param taMpInfo 实体对象
//     * @return
//     */
//    @RequestMapping(value="/taMpInfo",method= RequestMethod.POST)
//    public ResponseBean taMpInfoAdd(@RequestBody TaMpInfo taMpInfo){
//        ResponseBean responseBean = new ResponseBean();
//        try {
//            if (iTaMpInfoService.save(taMpInfo)){
//                responseBean.addSuccess(taMpInfo);
//            }else {
//                responseBean.addError("fail");
//            }
//        }catch (Exception e){
//            e.printStackTrace();
//            logger.error("taMpInfoAdd -=- {}",e.toString());
//            responseBean.addError(e.getMessage());
//        }
//        return responseBean;
//    }
//
//    /**
//     * 根据id删除对象
//     * @param id  实体ID
//     */
//    @ResponseBody
//    @RequestMapping(value="/taMpInfo/{id}", method= RequestMethod.DELETE)
//    public ResponseBean taMpInfoDelete(@PathVariable Integer id){
//        ResponseBean responseBean = new ResponseBean();
//        try {
//            if(iTaMpInfoService.removeById(id)){
//                responseBean.addSuccess("success");
//            }else {
//                responseBean.addError("fail");
//            }
//        }catch (Exception e){
//            e.printStackTrace();
//            logger.error("taMpInfoDelete -=- {}",e.toString());
//            responseBean.addError(e.getMessage());
//        }
//        return responseBean;
//    }
//
//    /**
//     * 修改对象
//     * @param id  实体ID
//     * @param taMpInfo 实体对象
//     * @return
//     */
//    @RequestMapping(value="/taMpInfo/{id}",method= RequestMethod.PUT)
//    public ResponseBean taMpInfoUpdate(@PathVariable Integer id,
//                                        @RequestBody TaMpInfo taMpInfo){
//        ResponseBean responseBean = new ResponseBean();
//        try {
//            if (iTaMpInfoService.updateById(taMpInfo)){
//                responseBean.addSuccess(taMpInfo);
//            }else {
//                responseBean.addError("fail");
//            }
//        }catch (Exception e){
//            e.printStackTrace();
//            logger.error("taMpInfoUpdate -=- {}",e.toString());
//            responseBean.addError(e.getMessage());
//        }
//        return responseBean;
//    }
//
    /**
     * 根据id查询对象
     * @param id  实体ID
     */
    @RequestMapping(value="/admin/taMpInfo",method= RequestMethod.GET)
    public ResponseBean taMpInfoGet(HttpServletRequest request){
        Integer orgId = getOrgId(request);
        TaMpInfo taMpInfo = iTaMpInfoService.getByOrgId(orgId);
        return ResponseBean.success(taMpInfo);
    }

    /**
     * 暂时仅支持 jpg
     * @param file
     * @param request
     * @return
     */
    @PostMapping("/admin/mp/material/miniapp")
    public ResponseBean postMpMiniappMedia(@RequestParam("file") MultipartFile file,
                                           HttpServletRequest request) {
        if (file.isEmpty()) {
            return ResponseBean.error("请选择文件上传", ResponseBean.ERROR_MISSING_PARAMS);
        }

        Integer orgId = getOrgId(request);
        TaMpInfo taMpInfo = iTaMpInfoService.getByOrgId(orgId);

        try {
            String nwName = "yz-"+LocalDateTime.now().getNano();
            String path = System.getProperty("java.io.tmpdir") + System.getProperty("file.separator") + nwName;
            File tmpFile = File.createTempFile(path, ".jpg");
            file.transferTo(tmpFile);

            String fname = null == file.getOriginalFilename() ? nwName : file.getOriginalFilename();
            if (!fname.contains(".jpg")) {
                fname += ".jpg";
            }

            WxMpMaterial wxMaterial = new WxMpMaterial();
            wxMaterial.setFile(tmpFile);
            wxMaterial.setName(fname);

            WxMpMaterialUploadResult res = wxUtils.getMpService(orgId).getMaterialService().materialFileUpload(WxConsts.MaterialType.IMAGE, wxMaterial);

            if (StringUtils.isEmpty(res.getMediaId())) {
                log.error("上传图片到微信失败 [{}]: {}", res.getErrCode(), res.getErrMsg());
                return ResponseBean.error("上传图片到微信失败: " + res.getErrMsg(), ResponseBean.ERROR_UNAVAILABLE);
            }

            taMpInfo.setMiniappMedia(res.getMediaId());
            taMpInfo.setMiniappUrl(res.getUrl());
            if (!iTaMpInfoService.updateById(taMpInfo)) {
                return ResponseBean.error("保存图片媒体ID失败", ResponseBean.ERROR_UNAVAILABLE);
            }

            if (tmpFile.exists()) {
                tmpFile.delete();
            }

            return ResponseBean.success(new HashMap<String, String>(){{
                put("mediaId", res.getMediaId());
                put("url", res.getUrl());
            }});

        } catch (IOException e) {
            e.printStackTrace();
            return ResponseBean.error("接收图片失败: " + e.getMessage(), ResponseBean.ERROR_UNAVAILABLE);
        } catch (WxErrorException e) {
            e.printStackTrace();
            return ResponseBean.error("上传图片到微信失败: " + e.getMessage(), ResponseBean.ERROR_UNAVAILABLE);
        }
    }
}
