package com.foxinmy.weixin4j.model;

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

import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.type.ButtonType;

/**
 * 菜单按钮
 * <p>
 * 目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单,一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以"..."代替
 * 请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来,建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果
 * </p>
 *
 * @className Button
 * @author jinyu(foxinmy@gmail.com)
 * @date 2014年4月5日
 * @since JDK 1.6
 */
public class Button implements Serializable {

    private static final long serialVersionUID = -6422234732203854866L;

    /**
     * 菜单标题，不超过16个字节，子菜单不超过40个字节
     */
    private String name;
    /**
     * 菜单类型 </br>
     * <font color="red"> 公众平台官网上能够设置的菜单类型有view、text、img、photo、video、voice
     * </font>
     *
     * @see com.foxinmy.weixin4j.type.ButtonType
     */
    private String type;
    /**
     * 菜单KEY值,根据type的类型而定
     * </p>
     * 通过公众平台设置的自定义菜单：</br>
     * <li>text:保存文字；
     * <li>img、voice：保存媒体ID；
     * <li>video：保存视频URL；
     * <li>news：保存图文消息媒体ID
     * <li>view：保存链接URL；
     * <p>
     * 使用API设置的自定义菜单：
     * </p>
     * <li>click、scancode_push、scancode_waitmsg、pic_sysphoto、pic_photo_or_album、
     * pic_weixin、location_select：保存key；
     * <li>view：保存链接URL;
     * <li>media_id、view_limited：保存媒体ID
     */
    private String content;
    /**
     * 扩展属性，比如在公众平台设置菜单时的图文列表
     */
    @JSONField(serialize = false, deserialize = false)
    private Object extra;
    /**
     * miniprogram类型必须 小程序的appid（仅认证公众号可配置）
     */
    private String appid;
    /**
     * miniprogram类型必须 小程序的页面路径
     */
    private String pagepath;

    /**
     * 二级菜单数组，个数应为1~5个
     */
    @JSONField(name = "sub_button")
    private List<Button> subs;

    protected Button() {
        this.subs = new ArrayList<Button>();
    }

    /**
     * 创建一个具有子菜单的菜单
     *
     * @param name
     *            菜单名
     * @param subButtons
     *            二级菜单列表
     */
    public Button(String name, Button... subButtons) {
        this.name = name;
        this.subs = new ArrayList<Button>(Arrays.asList(subButtons));
    }

    /**
     * 创建一个普通菜单
     *
     * @param name
     *            菜单名
     * @param content
     *            菜单内容
     * @param type
     *            菜单类型
     */
    public Button(String name, String content, ButtonType type) {
        this.name = name;
        this.content = content;
        this.type = type.name();
        this.subs = new ArrayList<Button>();
    }

    /**
     * 小程序菜单
     *
     * @param name
     *            菜单名
     * @param url
     *            小程序的url页面
     * @param appid
     *            小程序的appid
     * @param pagepath
     *            小程序员的页面路径
     */
    public Button(String name, String url, String appid, String pagepath) {
        this.name = name;
        this.content = url;
        this.appid = appid;
        this.pagepath = pagepath;
        this.type = ButtonType.miniprogram.name();
        this.subs = new ArrayList<Button>();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public void setType(ButtonType type) {
        this.type = type.name();
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Object getExtra() {
        return extra;
    }

    /**
     * 扩展只读属性，设置无效
     *
     * @param extra
     */
    public void setExtra(Object extra) {
        this.extra = extra;
    }

    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getPagepath() {
        return pagepath;
    }

    public void setPagepath(String pagepath) {
        this.pagepath = pagepath;
    }

    public List<Button> getSubs() {
        return subs;
    }

    public void setSubs(List<Button> subs) {
        this.subs = subs;
    }

    public Button pushSub(Button btn) {
        this.subs.add(btn);
        return this;
    }

    @Override
    public String toString() {
        return "Button [name=" + name + ", type=" + type + ", content=" + content + ", extra=" + extra + ", appid="
                + appid + ", pagepath=" + pagepath + ", subs=" + subs + "]";
    }
}
