package com.usoftchina.qywx.sdk;

import com.usoftchina.qywx.sdk.config.QywxProperties;
import com.usoftchina.qywx.sdk.dto.UploadImageResp;
import com.usoftchina.qywx.sdk.dto.UploadResp;
import com.usoftchina.qywx.sdk.exception.WeiXinAccessException;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.*;
import org.springframework.ui.ModelMap;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;

/**
 * 素材管理
 *
 * @author yingp
 */
public class MediaSdk extends BaseSdk {
    public MediaSdk(QywxProperties properties) {
        super(properties);
    }

    /**
     * 上传临时素材
     * <p>
     * 所有文件size必须大于5个字节
     * 图片（image）：2MB，支持JPG,PNG格式
     * 语音（voice） ：2MB，播放长度不超过60s，仅支持AMR格式
     * 视频（video） ：10MB，支持MP4格式
     * 普通文件（file）：20MB
     * </p>
     *
     * @param agentCode
     * @param data
     * @param name
     * @param type
     * @return mediaId
     */
    public String upload(String agentCode, byte[] data, String name, FileType type) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
        form.add("name", "media");
        form.add("media", new ByteArrayResource(data));
        form.add("filename", name);
        form.add("filelength", data.length);
        HttpEntity<MultiValueMap<String, Object>> req = new HttpEntity<>(form, headers);
        ResponseEntity<UploadResp> resp = restTemplate.postForEntity(baseUrl + "/cgi-bin/media/upload?access_token={access_token}&type={type}",
                req, UploadResp.class,
                new ModelMap("access_token", getAccessToken(agentCode))
                        .addAttribute("type", type.code));
        assertOK(resp);
        return resp.getBody().getMedia_id();
    }

    public enum FileType {
        /**
         * 图片
         */
        IMAGE("image"),
        /**
         * 语音
         */
        VOICE("voice"),
        /**
         * 视频
         */
        VIDEO("video"),
        /**
         * 普通文件
         */
        FILE("file");

        private final String code;

        FileType(String code) {
            this.code = code;
        }
    }

    /**
     * 上传图片
     * <p>
     * 上传图片得到图片URL，该URL永久有效
     * 返回的图片URL，仅能用于图文消息正文中的图片展示；若用于非企业微信域名下的页面，图片将被屏蔽。
     * 每个企业每天最多可上传100张图片
     * 图片文件大小应在 5B ~ 2MB 之间
     * </p>
     *
     * @param agentCode
     * @param data
     * @param name
     * @param type
     * @return
     */
    public String uploadImage(String agentCode, byte[] data, String name, MediaType type) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(type);
        MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
        form.add("name", "file");
        form.add("file", new ByteArrayResource(data));
        form.add("filename", name);
        HttpEntity<MultiValueMap<String, Object>> req = new HttpEntity<>(form, headers);
        ResponseEntity<UploadImageResp> resp = restTemplate.postForEntity(baseUrl + "/cgi-bin/media/uploadimg?access_token={access_token}",
                req, UploadImageResp.class,
                new ModelMap("access_token", getAccessToken(agentCode)));
        assertOK(resp);
        return resp.getBody().getUrl();
    }

    /**
     * 获取临时素材
     *
     * @param agentCode
     * @param mediaId
     * @return
     */
    public byte[] getMedia(String agentCode, String mediaId) {
        ResponseEntity<byte[]> resp = restTemplate.getForEntity(baseUrl + "/cgi-bin/media/get?access_token={access_token}&media_id={media_id}",
                byte[].class,
                new ModelMap("access_token", getAccessToken(agentCode))
                        .addAttribute("media_id", mediaId));
        if (resp.getStatusCode() != HttpStatus.OK) {
            throw new WeiXinAccessException(resp);
        }
        return resp.getBody();
    }
}
