package me.chanjar.weixin.open.api;

import cn.binarywang.wx.miniapp.api.WxMaService;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage;
import me.chanjar.weixin.open.bean.result.*;

import java.io.File;
import java.util.List;
import java.util.Map;

/**
 * <pre>
 *     微信开放平台代小程序实现服务能力
 *     https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489144594_DhNoV&token=&lang=zh_CN
 * </pre>
 *
 * @author yqx
 * @date 2018 /9/12
 */
public interface WxOpenMaService extends WxMaService {
  /**
   * 设置小程序服务器域名.
   *
   * <pre>
   *     授权给第三方的小程序，其服务器域名只可以为第三方的服务器，当小程序通过第三方发布代码上线后，小程序原先自己配置的服务器域名将被删除，
   *     只保留第三方平台的域名，所以第三方平台在代替小程序发布代码之前，需要调用接口为小程序添加第三方自身的域名。
   *     提示：需要先将域名登记到第三方平台的小程序服务器域名中，才可以调用接口进行配置
   * </pre>
   */
  String API_MODIFY_DOMAIN = "https://api.weixin.qq.com/wxa/modify_domain";

  /**
   * 设置小程序业务域名（仅供第三方代小程序调用）
   * <pre>
   *     授权给第三方的小程序，其业务域名只可以为第三方的服务器，当小程序通过第三方发布代码上线后，小程序原先自己配置的业务域名将被删除，
   *     只保留第三方平台的域名，所以第三方平台在代替小程序发布代码之前，需要调用接口为小程序添加业务域名。
   * 提示：
   * 1、需要先将域名登记到第三方平台的小程序业务域名中，才可以调用接口进行配置。
   * 2、为授权的小程序配置域名时支持配置子域名，例如第三方登记的业务域名如为qq.com，则可以直接将qq.com及其子域名（如xxx.qq.com）也配置到授权的小程序中。
   * </pre>
   */
  String API_SET_WEBVIEW_DOMAIN = "https://api.weixin.qq.com/wxa/setwebviewdomain";

  /**
   * 获取帐号基本信息
   * <pre>
   * GET请求
   * 注意：需要使用1.3环节获取到的新创建小程序appid及authorization_code换取authorizer_refresh_token进而得到authorizer_access_token。
   * </pre>
   */
  String API_GET_ACCOUNT_BASICINFO = "https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo";

  /**
   * 绑定微信用户为小程序体验者
   */
  String API_BIND_TESTER = "https://api.weixin.qq.com/wxa/bind_tester";


  /**
   * 解除绑定微信用户为小程序体验者
   */
  String API_UNBIND_TESTER = "https://api.weixin.qq.com/wxa/unbind_tester";


  /**
   * 获取体验者列表
   */
  String API_GET_TESTERLIST = "https://api.weixin.qq.com/wxa/memberauth";

  /**
   * 以下接口基础信息设置
   * <p>
   * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21517799059ZSEMr&token=6f965b5daf30a98a6bbd2a386faea5c934e929bf&lang=zh_CN
   * </p>
   * 1. 设置小程序隐私设置（是否可被搜索）
   */
  String API_CHANGE_WXA_SEARCH_STATUS = "https://api.weixin.qq.com/wxa/changewxasearchstatus";

  /**
   * 2. 查询小程序当前隐私设置（是否可被搜索）
   */
  String API_GET_WXA_SEARCH_STATUS = "https://api.weixin.qq.com/wxa/getwxasearchstatus";

  /**
   * 3.1. 获取展示的公众号信息
   */
  String API_GET_SHOW_WXA_ITEM = "https://api.weixin.qq.com/wxa/getshowwxaitem";

  /**
   * 3.2 设置展示的公众号
   */
  String API_UPDATE_SHOW_WXA_ITEM = "https://api.weixin.qq.com/wxa/updateshowwxaitem";


  /**
   * 以下接口为三方平台代小程序实现的代码管理功能
   * <p>
   * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140610_Uavc4&token=fe774228c66725425675810097f9e48d0737a4bf&lang=zh_CN
   * </p>
   * 1. 为授权的小程序帐号上传小程序代码
   */
  String API_CODE_COMMIT = "https://api.weixin.qq.com/wxa/commit";

  /**
   * 2. 获取体验小程序的体验二维码
   */
  String API_TEST_QRCODE = "https://api.weixin.qq.com/wxa/get_qrcode";

  /**
   * 3. 获取授权小程序帐号的可选类目
   */
  String API_GET_CATEGORY = "https://api.weixin.qq.com/wxa/get_category";

  /**
   * 4. 获取小程序的第三方提交代码的页面配置（仅供第三方开发者代小程序调用）
   */
  String API_GET_PAGE = "https://api.weixin.qq.com/wxa/get_page";

  /**
   * 5. 将第三方提交的代码包提交审核（仅供第三方开发者代小程序调用）
   */
  String API_SUBMIT_AUDIT = "https://api.weixin.qq.com/wxa/submit_audit";

  /**
   * 7. 查询某个指定版本的审核状态（仅供第三方代小程序调用）
   */
  String API_GET_AUDIT_STATUS = "https://api.weixin.qq.com/wxa/get_auditstatus";

  /**
   * 8. 查询最新一次提交的审核状态（仅供第三方代小程序调用）
   */
  String API_GET_LATEST_AUDIT_STATUS = "https://api.weixin.qq.com/wxa/get_latest_auditstatus";

  /**
   * 9. 发布已通过审核的小程序（仅供第三方代小程序调用）
   */
  String API_RELEASE = "https://api.weixin.qq.com/wxa/release";

  /**
   * 10. 修改小程序线上代码的可见状态（仅供第三方代小程序调用)
   */
  String API_CHANGE_VISITSTATUS = "https://api.weixin.qq.com/wxa/change_visitstatus";

  /**
   * 11.小程序版本回退（仅供第三方代小程序调用）
   */
  String API_REVERT_CODE_RELEASE = "https://api.weixin.qq.com/wxa/revertcoderelease";

  /**
   * 12.查询当前设置的最低基础库版本及各版本用户占比 （仅供第三方代小程序调用）
   */
  String API_GET_WEAPP_SUPPORT_VERSION = "https://api.weixin.qq.com/cgi-bin/wxopen/getweappsupportversion";

  /**
   * 13.设置最低基础库版本（仅供第三方代小程序调用）
   */
  String API_SET_WEAPP_SUPPORT_VERSION = "https://api.weixin.qq.com/cgi-bin/wxopen/setweappsupportversion";

  /**
   * 14.设置小程序“扫普通链接二维码打开小程序”能力
   * <p>
   * https://mp.weixin.qq.com/debug/wxadoc/introduction/qrcode.html
   * 14.1 增加或修改二维码规则
   */
  String API_QRCODE_JUMP_ADD = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpadd";

  /**
   * 14.2 获取已设置的二维码规则
   */
  String API_QRCODE_JUMP_GET = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpget";

  /**
   * 14.3 获取校验文件名称及内容
   */
  String API_QRCODE_JUMP_DOWNLOAD = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpdownload";

  /**
   * 14.4 删除已设置的二维码规则
   */
  String API_QRCODE_JUMP_DELETE = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpdelete";

  /**
   * 14.5 发布已设置的二维码规则
   */
  String API_QRCODE_JUMP_PUBLISH = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumppublish";

  /**
   * 15.小程序审核撤回
   * <p>
   * 单个帐号每天审核撤回次数最多不超过1次，一个月不超过10次。
   * </p>
   */
  String API_UNDO_CODE_AUDIT = "https://api.weixin.qq.com/wxa/undocodeaudit";

  /**
   * 16.1 小程序分阶段发布-分阶段发布接口
   */
  String API_GRAY_RELEASE = "https://api.weixin.qq.com/wxa/grayrelease";

  /**
   * 16.2 小程序分阶段发布-取消分阶段发布
   */
  String API_REVERT_GRAY_RELEASE = "https://api.weixin.qq.com/wxa/revertgrayrelease";

  /**
   * 16.3 小程序分阶段发布-查询当前分阶段发布详情
   */
  String API_GET_GRAY_RELEASE_PLAN = "https://api.weixin.qq.com/wxa/getgrayreleaseplan";


  /**
   * 查询服务商的当月提审限额和加急次数（Quota）
   */
  String API_QUERY_QUOTA = "https://api.weixin.qq.com/wxa/queryquota";

  /**
   * 加急审核申请
   */
  String API_SPEED_AUDIT = "https://api.weixin.qq.com/wxa/speedupaudit";

  /**
   * 获得小程序的域名配置信息
   *
   * @return the domain
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaDomainResult getDomain() throws WxErrorException;

  /**
   * 修改域名
   *
   * @param action           delete删除, set覆盖, get获取
   * @param requestDomains   the requestdomain list
   * @param wsRequestDomains the wsrequestdomain list
   * @param uploadDomains    the uploaddomain list
   * @param downloadDomains  the downloaddomain list
   * @return the wx open ma domain result
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaDomainResult modifyDomain(String action, List<String> requestDomains, List<String> wsRequestDomains,
                                    List<String> uploadDomains, List<String> downloadDomains) throws WxErrorException;

  /**
   * 获取小程序的业务域名
   *
   * @return 直接返回字符串 web view domain
   * @throws WxErrorException the wx error exception
   */
  String getWebViewDomain() throws WxErrorException;

  /**
   * 获取小程序的业务域名
   *
   * @return web view domain info
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaWebDomainResult getWebViewDomainInfo() throws WxErrorException;

  /**
   * 设置小程序的业务域名
   *
   * @param action     add添加, delete删除, set覆盖
   * @param domainList the domain list
   * @return 直接返回字符串 web view domain
   * @throws WxErrorException the wx error exception
   */
  String setWebViewDomain(String action, List<String> domainList) throws WxErrorException;

  /**
   * 设置小程序的业务域名
   *
   * @param action     add添加, delete删除, set覆盖
   * @param domainList the domain list
   * @return web view domain info
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaWebDomainResult setWebViewDomainInfo(String action, List<String> domainList) throws WxErrorException;

  /**
   * 获取小程序的信息
   *
   * @return the account basic info
   * @throws WxErrorException the wx error exception
   */
  String getAccountBasicInfo() throws WxErrorException;

  /**
   * 绑定小程序体验者
   *
   * @param wechatId 体验者微信号（不是openid）
   * @return wx open ma bind tester result
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaBindTesterResult bindTester(String wechatId) throws WxErrorException;

  /**
   * 解除绑定小程序体验者
   *
   * @param wechatId 体验者微信号（不是openid）
   * @return the wx open result
   * @throws WxErrorException the wx error exception
   */
  WxOpenResult unbindTester(String wechatId) throws WxErrorException;

  /**
   * 解除绑定小程序体验者，其他平台绑定的体验者无法获取到wechatid，可用此方法解绑，详见文档
   * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/unbind_tester.html
   *
   * @param userStr 人员对应的唯一字符串， 可通过获取已绑定的体验者列表获取人员对应的字符串
   * @return the wx open result
   * @throws WxErrorException the wx error exception
   */
  WxOpenResult unbindTesterByUserStr(String userStr) throws WxErrorException;

  /**
   * 获得体验者列表
   *
   * @return the tester list
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaTesterListResult getTesterList() throws WxErrorException;

  /**
   * 设置小程序隐私设置（是否可被搜索）
   *
   * @param status 1表示不可搜索，0表示可搜索
   * @return the wx open result
   * @throws WxErrorException the wx error exception
   */
  WxOpenResult changeWxaSearchStatus(Integer status) throws WxErrorException;

  /**
   * 2. 查询小程序当前隐私设置（是否可被搜索）
   *
   * @return the wxa search status
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaSearchStatusResult getWxaSearchStatus() throws WxErrorException;

  /**
   * 3.1 获取展示的公众号信息
   *
   * @return the show wxa item
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaShowItemResult getShowWxaItem() throws WxErrorException;

  /**
   * 3.2 设置展示的公众号
   *
   * @param flag    0 关闭，1 开启
   * @param mpAppId 如果开启，需要传新的公众号appid
   * @return the wx open result
   * @throws WxErrorException the wx error exception
   */
  WxOpenResult updateShowWxaItem(Integer flag, String mpAppId) throws WxErrorException;

  /**
   * 1、为授权的小程序帐号上传小程序代码
   *
   * @param templateId  代码模板ID
   * @param userVersion 用户定义版本
   * @param userDesc    用户定义版本描述
   * @param extInfo     第三方自定义的配置
   * @return the wx open result
   * @throws WxErrorException the wx error exception
   */
  WxOpenResult codeCommit(Long templateId, String userVersion, String userDesc, WxMaOpenCommitExtInfo extInfo) throws WxErrorException;

  /**
   * 获取体验小程序的体验二维码
   *
   * @param pagePath the page path
   * @param params   the params
   * @return the test qrcode
   * @throws WxErrorException the wx error exception
   */
  File getTestQrcode(String pagePath, Map<String, String> params) throws WxErrorException;

  /**
   * 获取授权小程序帐号的可选类目
   * <p>
   * 注意：该接口可获取已设置的二级类目及用于代码审核的可选三级类目。
   * </p>
   *
   * @return the category list
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaCategoryListResult getCategoryList() throws WxErrorException;

  /**
   * 获取小程序的第三方提交代码的页面配置（仅供第三方开发者代小程序调用）
   *
   * @return page list
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaPageListResult getPageList() throws WxErrorException;

  /**
   * 将第三方提交的代码包提交审核（仅供第三方开发者代小程序调用）
   *
   * @param submitAuditMessage the submit audit message
   * @return the wx open ma submit audit result
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaSubmitAuditResult submitAudit(WxOpenMaSubmitAuditMessage submitAuditMessage) throws WxErrorException;

  /**
   * 查询某个指定版本的审核状态（仅供第三方代小程序调用）
   *
   * @param auditId the auditid
   * @return the audit status
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaQueryAuditResult getAuditStatus(Long auditId) throws WxErrorException;

  /**
   * 8. 查询最新一次提交的审核状态（仅供第三方代小程序调用）
   *
   * @return 。
   * @throws WxErrorException 。
   */
  WxOpenMaQueryAuditResult getLatestAuditStatus() throws WxErrorException;

  /**
   * 9. 发布已通过审核的小程序（仅供第三方代小程序调用）
   * <p>
   * 请填写空的数据包，POST的json数据包为空即可。
   * </p>
   *
   * @return 。
   * @throws WxErrorException 。
   */
  WxOpenResult releaseAudited() throws WxErrorException;

  /**
   * 10. 修改小程序线上代码的可见状态（仅供第三方代小程序调用）
   *
   * @param action the action
   * @return the wx open result
   * @throws WxErrorException the wx error exception
   */
  WxOpenResult changeVisitStatus(String action) throws WxErrorException;

  /**
   * 11. 小程序版本回退（仅供第三方代小程序调用）
   *
   * @return 。
   * @throws WxErrorException 。
   */
  WxOpenResult revertCodeRelease() throws WxErrorException;

  /**
   * 15. 小程序审核撤回
   * <p>
   * 单个帐号每天审核撤回次数最多不超过1次，一个月不超过10次。
   * </p>
   *
   * @return 。
   * @throws WxErrorException 。
   */
  WxOpenResult undoCodeAudit() throws WxErrorException;

  /**
   * 12. 查询当前设置的最低基础库版本及各版本用户占比 （仅供第三方代小程序调用）
   *
   * @return 。
   * @throws WxErrorException 。
   */
  String getSupportVersion() throws WxErrorException;

  /**
   * 12. 查询当前设置的最低基础库版本及各版本用户占比 （仅供第三方代小程序调用）
   *
   * @return . support version info
   * @throws WxErrorException .
   */
  WxOpenMaWeappSupportVersionResult getSupportVersionInfo() throws WxErrorException;

  /**
   * 设置最低基础库版本（仅供第三方代小程序调用）
   *
   * @param version the version
   * @return the support version
   * @throws WxErrorException the wx error exception
   */
  String setSupportVersion(String version) throws WxErrorException;

  /**
   * 13. 设置最低基础库版本（仅供第三方代小程序调用）
   *
   * @param version the version
   * @return support version info
   * @throws WxErrorException the wx error exception
   */
  WxOpenResult setSupportVersionInfo(String version) throws WxErrorException;

  /**
   * 16. 小程序分阶段发布 - 1)分阶段发布接口
   *
   * @param grayPercentage 灰度的百分比，1到100的整数
   * @return . wx open result
   * @throws WxErrorException .
   */
  WxOpenResult grayRelease(Integer grayPercentage) throws WxErrorException;

  /**
   * 16. 小程序分阶段发布 - 2)取消分阶段发布
   *
   * @return . wx open result
   * @throws WxErrorException .
   */
  WxOpenResult revertGrayRelease() throws WxErrorException;

  /**
   * 16. 小程序分阶段发布 - 3)查询当前分阶段发布详情
   *
   * @return . gray release plan
   * @throws WxErrorException .
   */
  WxOpenMaGrayReleasePlanResult getGrayReleasePlan() throws WxErrorException;

  /**
   * 查询服务商的当月提审限额和加急次数（Quota）
   * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/code/query_quota.html
   *
   * @return the wx open ma query quota result
   * @throws WxErrorException the wx error exception
   */
  WxOpenMaQueryQuotaResult queryQuota() throws WxErrorException;

  /**
   * 加急审核申请
   * 有加急次数的第三方可以通过该接口，对已经提审的小程序进行加急操作，加急后的小程序预计2-12小时内审完。
   *
   * @param auditId the auditid
   * @return the boolean
   * @throws WxErrorException the wx error exception
   */
  Boolean speedAudit(Long auditId) throws WxErrorException;

  /**
   * (1)增加或修改二维码规则
   *
   * @param wxQrcodeJumpRule the wx qrcode jump rule
   * @return the wx open result
   * @throws WxErrorException the wx error exception
   */
  WxOpenResult addQrcodeJump(WxQrcodeJumpRule wxQrcodeJumpRule) throws WxErrorException;

  /**
   * (2)获取已设置的二维码规则
   *
   * @return the qrcode jump
   * @throws WxErrorException the wx error exception
   */
  WxGetQrcodeJumpResult getQrcodeJump() throws WxErrorException;

  /**
   * (3)获取校验文件名称及内容
   *
   * @return the wx downlooad qrcode jump result
   * @throws WxErrorException the wx error exception
   */
  WxDownlooadQrcodeJumpResult downloadQrcodeJump() throws WxErrorException;

  /**
   * (4)删除已设置的二维码规则
   *
   * @param prefix the prefix
   * @return the wx open result
   * @throws WxErrorException the wx error exception
   */
  WxOpenResult deleteQrcodeJump(String prefix) throws WxErrorException;

  /**
   * (5)发布已设置的二维码规则
   *
   * @param prefix the prefix
   * @return the wx open result
   * @throws WxErrorException the wx error exception
   */
  WxOpenResult publishQrcodeJump(String prefix) throws WxErrorException;
}
