package me.chanjar.weixin.mp.bean.menu;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.google.gson.annotations.SerializedName;
import lombok.Data;
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;

/**
 * <pre>
 * Created by Binary Wang on 2016-11-25.
 * </pre>
 *
 * @author <a href="https://github.com/binarywang">Binary Wang</a>
 */
@Data
public class WxMpSelfMenuInfo implements Serializable {
  private static final long serialVersionUID = -81203094124202901L;

  /**
   * 菜单按钮
   */
  @SerializedName("button")
  private List<WxMpSelfMenuButton> buttons;

  @Override
  public String toString() {
    return WxMpGsonBuilder.create().toJson(this);
  }

  @Data
  public static class WxMpSelfMenuButton implements Serializable {
    private static final long serialVersionUID = -4426602953309048341L;

    /**
     * <pre>
     * 菜单的类型，公众平台官网上能够设置的菜单类型有view（跳转网页）、text（返回文本，下同）、img、photo、video、voice。
     * 使用API设置的则有8种，详见<a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013&token=&lang=zh_CN">《自定义菜单创建接口》</a>
     * </pre>
     */
    @SerializedName("type")
    private String type;
    /**
     * 菜单名称.
     */
    @SerializedName("name")
    private String name;
    /**
     * <pre>
     * 对于不同的菜单类型，value的值意义不同.
     * 官网上设置的自定义菜单：
     *  <li>Text:保存文字到value；
     *  <li>Img、voice：保存mediaID到value；
     *  <li>Video：保存视频下载链接到value；
     *  <li>News：保存图文消息到news_info，同时保存mediaID到value；
     *  <li>View：保存链接到url。</li>
     *
     * 使用API设置的自定义菜单：
     *  <li>click、scancode_push、scancode_waitmsg、pic_sysphoto、pic_photo_or_album、pic_weixin、location_select：保存值到key；
     *  <li>view：保存链接到url
     *  </pre>
     */
    @SerializedName("key")
    private String key;
    /**
     * .
     *
     * @see #key
     */
    @SerializedName("url")
    private String url;

    /**
     * .
     *
     * @see #key
     */
    @SerializedName("value")
    private String value;

    /**
     * 调用新增永久素材接口返回的合法media_id
     * <p>
     * media_id类型和view_limited类型必须
     */
    @SerializedName("media_id")
    private String mediaId;

    /**
     * 发布后获得的合法article_id
     * <p>
     * article_id类型和article_view_limited类型必须
     */
    @SerializedName("article_id")
    private String articleId;

    /**
     * <pre>
     * 小程序的appid.
     * miniprogram类型必须
     * </pre>
     */
    @SerializedName("appid")
    private String appId;

    /**
     * <pre>
     * 小程序的页面路径.
     * miniprogram类型必须
     * </pre>
     */
    @SerializedName("pagepath")
    private String pagePath;
    /**
     * 子菜单信息.
     */
    @SerializedName("sub_button")
    private SubButtons subButtons;
    /**
     * 图文消息的信息.
     */
    @SerializedName("news_info")
    private NewsInfo newsInfo;

    @Override
    public String toString() {
      return WxMpGsonBuilder.create().toJson(this);
    }

    @Data
    public static class SubButtons implements Serializable {
      private static final long serialVersionUID = 1763350658575521079L;

      @SerializedName("list")
      private List<WxMpSelfMenuButton> subButtons = new ArrayList<>();

      @Override
      public String toString() {
        return WxMpGsonBuilder.create().toJson(this);
      }
    }

    @Data
    public static class NewsInfo implements Serializable {
      private static final long serialVersionUID = 3449813746347818457L;

      @SerializedName("list")
      private List<NewsInButton> news = new ArrayList<>();

      @Override
      public String toString() {
        return WxMpGsonBuilder.create().toJson(this);
      }

      @Data
      public static class NewsInButton implements Serializable {
        private static final long serialVersionUID = 8701455967664912972L;

        /**
         * 图文消息的标题.
         */
        @SerializedName("title")
        private String title;
        /**
         * 摘要.
         */
        @SerializedName("digest")
        private String digest;
        /**
         * 作者.
         */
        @SerializedName("author")
        private String author;
        /**
         * 是否显示封面，0为不显示，1为显示.
         */
        @SerializedName("show_cover")
        private Integer showCover;
        /**
         * 封面图片的URL.
         */
        @SerializedName("cover_url")
        private String coverUrl;
        /**
         * 正文的URL.
         */
        @SerializedName("content_url")
        private String contentUrl;
        /**
         * 原文的URL，若置空则无查看原文入口.
         */
        @SerializedName("source_url")
        private String sourceUrl;

        @Override
        public String toString() {
          return WxMpGsonBuilder.create().toJson(this);
        }
      }
    }
  }
}
