package com.house365.service.interfaces;

import com.house365.beans.dto.AgentDTO;
import com.house365.beans.dto.DepartmentDTO;
import com.house365.beans.dto.TagDTO;
import com.house365.beans.dto.UserDTO;
import com.house365.service.impl.EnterpriseClientHystrix;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.*;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Date: 2016/12/30</p>
 *
 * @author XN
 * @version 1.0
 */
@FeignClient(value = "wechat-service", fallback = EnterpriseClientHystrix.class)
public interface EnterpriseClient {

    /**
     * @param corpId corpId
     * @param secret secret
     *               get:     获取企业号应用
     *               <p>  agentid 企业应用的id</p>
     *               <p>
     *               set:     设置企业号应用
     *               <p>  agentid 企业应用的id</p>
     *               <p>  report_location_flag 企业应用是否打开地理位置上报 0：不上报；1：进入会话上报；2：持续上报</p>
     *               <p>  logo_mediaid 企业应用头像的mediaid，通过多媒体接口上传图片获得mediaid，上传后会自动裁剪成方形和圆形两个头像</p>
     *               <p>  name 企业应用名称</p>
     *               <p>  description 企业应用详情</p>
     *               <p>  redirect_domain 企业应用可信域名</p>
     *               <p>  isreportuser 是否接收用户变更通知。0：不接收；1：接收。</p>
     *               <p>  isreportenter 是否上报用户进入应用事件。0：不接收；1：接收。</p>
     *               <p>  home_url 主页型应用url。url必须以http或者https开头。消息型应用无需该参数</p>
     *               <p>  chat_extension_url 关联会话url。设置该字段后，企业会话"+"号将出现该应用，点击应用可直接跳转到此url，支持jsapi向当前会话发送消息。</p>
     *               <p>
     *               list:    获取应用概况列表
     */
    @RequestMapping(value = "enterprise/agent/{method}", method = RequestMethod.POST)
    String agent(@PathVariable("method") String method, @RequestParam(value = "corpId") String corpId,
                 @RequestParam(value = "secret") String secret, @RequestBody AgentDTO agentDTO);

    /**
     * @param corpId  corpId
     * @param secret  secret
     * @param agentId 应用id
     *                create:  创建应用菜单
     *                <p>  botton 自定义菜单json</p>
     *                <p>
     *                delete:  删除菜单
     *                <p>
     *                get:     获取菜单列表
     */
    @RequestMapping(value = "enterprise/menu/{method}", method = RequestMethod.POST)
    String menu(@PathVariable("method") String method, @RequestParam(value = "corpId") String corpId,
                @RequestParam(value = "secret") String secret, @RequestParam(value = "agentid") String agentId,
                @RequestParam(value = "button", required = false) String button);

    /**
     * authsucc:    成员关注企业号二次验证
     * <p>  userid 成员UserID</p>
     * <p>
     * create:      创建成员
     * <p>  userid 成员UserID。对应管理端的帐号，企业内必须唯一。不区分大小写，长度为1~64个字节</p>
     * <p>  name 成员名称。长度为1~64个字节</p>
     * <p>  department 成员所属部门id列表,不超过20个</p>
     * <p>  position 职位信息。长度为0~64个字节</p>
     * <p>  mobile 手机号码。企业内必须唯一，mobile/weixinid/email三者不能同时为空</p>
     * <p>  gender 性别。1表示男性，2表示女性</p>
     * <p>  email 邮箱。长度为0~64个字节。企业内必须唯一</p>
     * <p>  weixinid 微信号。企业内必须唯一。（注意：是微信号，不是微信的名字）</p>
     * <p>  avatar_mediaid 成员头像的mediaid，通过多媒体接口上传图片获得的mediaid</p>
     * <p>  extattr 扩展属性。扩展属性需要在WEB管理端创建后才生效，否则忽略未知属性的赋值</p>
     * <p>
     * update:      更新成员
     * <p>  userid 成员UserID。对应管理端的帐号，企业内必须唯一。不区分大小写，长度为1~64个字节</p>
     * <p>  name 成员名称。长度为1~64个字节</p>
     * <p>  department 成员所属部门id列表,不超过20个</p>
     * <p>  position 职位信息。长度为0~64个字节</p>
     * <p>  mobile 手机号码。企业内必须唯一，mobile/weixinid/email三者不能同时为空</p>
     * <p>  gender 性别。1表示男性，2表示女性</p>
     * <p>  email 邮箱。长度为0~64个字节。企业内必须唯一</p>
     * <p>  weixinid 微信号。企业内必须唯一。（注意：是微信号，不是微信的名字）</p>
     * <p>  avatar_mediaid 成员头像的mediaid，通过多媒体接口上传图片获得的mediaid</p>
     * <p>  extattr 扩展属性。扩展属性需要在WEB管理端创建后才生效，否则忽略未知属性的赋值</p>
     * <p>
     * delete:      删除成员
     * <p>  userid 成员UserID。对应管理端的帐号</p>
     * <p>
     * batchdelete: 批量删除成员
     * <p>  useridlist 成员UserID列表。对应管理端的帐号。（最多支持200个）</p>
     * <p>
     * get:         获取成员
     * <p>  department_id 获取的部门id</p>
     * <p>  1/0：是否递归获取子部门下面的成员</p>
     * <p>  status 0获取全部成员，1获取已关注成员列表，2获取禁用成员列表，4获取未关注成员列表。status可叠加，未填写则默认为4</p>
     * <p>
     * simplelist:  获取部门成员
     * <p>  department_id 获取的部门id</p>
     * <p>  1/0：是否递归获取子部门下面的成员</p>
     * <p>  status 0获取全部成员，1获取已关注成员列表，2获取禁用成员列表，4获取未关注成员列表。status可叠加，未填写则默认为4</p>
     * <p>
     * list:        获取部门成员(详情)
     * <p>  department_id 获取的部门id</p>
     * <p>  1/0：是否递归获取子部门下面的成员</p>
     * <p>  status 0获取全部成员，1获取已关注成员列表，2获取禁用成员列表，4获取未关注成员列表。status可叠加，未填写则默认为4</p>
     */
    @RequestMapping(value = "enterprise/user/{method}", method = RequestMethod.POST)
    String user(@PathVariable("method") String method, @RequestParam(value = "corpId") String corpId,
                @RequestParam(value = "secret") String secret, @RequestBody UserDTO user);

    /**
     * create:      创建部门
     * <p>  id 部门id，整型。指定时必须大于1，不指定时则自动生成</p>
     * <p>  name 部门名称。长度限制为32个字（汉字或英文字母），字符不能包括\:*?"<>｜</p>
     * <p>  parentid 父亲部门id。根部门id为1</p>
     * <p>  order 在父部门中的次序值。order值小的排序靠前。</p>
     * <p>
     * update:      更新部门
     * <p>  id 部门id，整型。指定时必须大于1，不指定时则自动生成</p>
     * <p>  name 部门名称。长度限制为32个字（汉字或英文字母），字符不能包括\:*?"<>｜</p>
     * <p>  parentid 父亲部门id。根部门id为1</p>
     * <p>  order 在父部门中的次序值。order值小的排序靠前。</p>
     * <p>
     * delete:      删除部门
     * <p>  id 部门id。（注：不能删除根部门；不能删除含有子部门、成员的部门）</p>
     * <p>
     * list:        获取部门列表
     * <p>  id 部门id。获取指定部门及其下的子部门</p>
     */
    @RequestMapping(value = "enterprise/department/{method}", method = RequestMethod.POST)
    String department(@PathVariable("method") String method, @RequestParam(value = "corpId") String corpId,
                      @RequestParam(value = "secret") String secret, @RequestBody DepartmentDTO department);

    /**
     * create:      创建标签
     * <p>  tagname 标签名称，长度限制为32个字（汉字或英文字母），标签名不可与其他标签重名。</p>
     * <p>  tagid 标签id，整型，指定此参数时新增的标签会生成对应的标签id，不指定时则以目前最大的id自增。</p>
     * <p>
     * update:      更新标签名字
     * <p>  tagname 标签名称，长度限制为32个字（汉字或英文字母），标签名不可与其他标签重名。</p>
     * <p>  tagid 标签id，整型，指定此参数时新增的标签会生成对应的标签id，不指定时则以目前最大的id自增。</p>
     * <p>
     * delete:      删除标签
     * <p>  tagid 标签ID</p>
     * <p>
     * get:         获取标签成员
     * <p>  tagid 标签id</p>
     * <p>
     * addtagusers: 增加标签成员
     * <p>  tagid 标签id</p>
     * <p>  userlist 企业成员ID列表，注意：userlist、partylist不能同时为空，单次请求长度不超过1000</p>
     * <p>  partylist 企业部门ID列表，注意：userlist、partylist不能同时为空，单次请求长度不超过100</p>
     * <p>
     * deltagusers: 删除标签成员
     * <p>  tagid 标签id</p>
     * <p>  userlist 企业成员ID列表，注意：userlist、partylist不能同时为空，单次请求长度不超过1000</p>
     * <p>  partylist 企业部门ID列表，注意：userlist、partylist不能同时为空，单次请求长度不超过100</p>
     * <p>
     * list:        获取标签列表
     */
    @RequestMapping(value = "enterprise/tag/{method}", method = RequestMethod.POST)
    String tag(@PathVariable("method") String method, @RequestParam(value = "corpId") String corpId,
               @RequestParam(value = "secret") String secret, @RequestBody TagDTO tag);

    /**
     * syncuser:      增量更新成员
     * <p>  media_id 上传的csv文件的media_id</p>
     * <p>  callback 回调信息。如填写该项则任务完成后，通过callback推送事件给企业。具体请参考应用回调模式中的相应选项</p>
     * <p>
     * replaceuser:      全量覆盖成员
     * <p>  media_id 上传的csv文件的media_id</p>
     * <p>  callback 回调信息。如填写该项则任务完成后，通过callback推送事件给企业。具体请参考应用回调模式中的相应选项</p>
     * <p>
     * replaceparty:      全量覆盖部门
     * <p>  media_id 上传的csv文件的media_id</p>
     * <p>  callback 回调信息。如填写该项则任务完成后，通过callback推送事件给企业。具体请参考应用回调模式中的相应选项</p>
     * <p>
     * getresult:        获取异步任务结果
     * <p>  jobid 异步任务id，最大长度为64字节</p>
     */
    @RequestMapping(value = "enterprise/batch/{method}", method = RequestMethod.POST)
    String batch(@PathVariable("method") String method, @RequestParam(value = "corpId") String corpId,
                 @RequestParam(value = "secret") String secret, @RequestParam(value = "media_id") String mediaId,
                 @RequestParam(value = "callback") String callback, @RequestParam(value = "jobid") String jobId);
}
