/*
 * 微信公众平台(JAVA) SDK
 *
 * Copyright (c) 2014, Ansitech Network Technology Co.,Ltd All rights reserved.
 *
 * http://www.weixin4j.org/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.weixin4j.model.menu;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * 菜单对象
 *
 * @author yangqisheng
 * @since 0.0.1
 */
public class Menu {

    private List<SingleButton> button;

    public Menu() {
    }

    public Menu(JSONObject jsonObj) {
        //初始化一级自定义菜单
        button = new ArrayList<SingleButton>();

        //获取menu对象
        JSONObject menuObj = jsonObj.getJSONObject("menu");
        if (menuObj != null) {
            //获取button列表
            JSONArray buttonJson = menuObj.getJSONArray("button");
            for (int i = 0; i < buttonJson.size(); i++) {
                JSONObject jsonButton = buttonJson.getJSONObject(i);
                recursion(jsonButton, null);
            }
        }
    }

    private void recursion(JSONObject jsonButton, SingleButton menuButton) {
        String type = null;
        if (jsonButton.containsKey("type")) {
            type = jsonButton.getString("type");
        }
        SingleButton singleButton = null;
        //判断对象type
        if (type == null) {
            //有子的自定义菜单
            singleButton = new SingleButton(jsonButton.getString("name"));
        } else if (type.equals(ButtonType.Click.toString())) {
            //转成点击按钮
            singleButton = new ClickButton(jsonButton.getString("name"), jsonButton.getString("key"));
        } else if (type.equals(ButtonType.View.toString())) {
            //转成view按钮
            singleButton = new ViewButton(jsonButton.getString("name"), jsonButton.getString("url"));
        } else if (type.equals(ButtonType.Scancode_Push.toString())) {
            //扫码推事件
            singleButton = new ScancodePushButton(jsonButton.getString("name"), jsonButton.getString("key"));
        } else if (type.equals(ButtonType.Scancode_Waitmsg.toString())) {
            //扫码推事件且弹出“消息接收中”提示框
            singleButton = new ScancodeWaitMsgButton(jsonButton.getString("name"), jsonButton.getString("key"));
        } else if (type.equals(ButtonType.Pic_SysPhoto.toString())) {
            //弹出系统拍照发图
            singleButton = new PicSysPhotoButton(jsonButton.getString("name"), jsonButton.getString("key"));
        } else if (type.equals(ButtonType.Pic_Photo_OR_Album.toString())) {
            //弹出拍照或者相册发图
            singleButton = new PicPhotoOrAlbumButton(jsonButton.getString("name"), jsonButton.getString("key"));
        } else if (type.equals(ButtonType.Pic_Weixin.toString())) {
            //弹出微信相册发图器
            singleButton = new PicWeixinButton(jsonButton.getString("name"), jsonButton.getString("key"));
        } else if (type.equals(ButtonType.Location_Select.toString())) {
            //弹出地理位置选择器
            singleButton = new LocationSelectButton(jsonButton.getString("name"), jsonButton.getString("key"));
        } else if (type.equals(ButtonType.Media_Id.toString())) {
            //永久素材(图片、音频、视频、图文消息)
            singleButton = new MediaIdButton(jsonButton.getString("name"), jsonButton.getString("media_id"));
        } else if (type.equals(ButtonType.View_Limited.toString())) {
            //永久素材(图文消息)
            singleButton = new ViewLimitedButton(jsonButton.getString("name"), jsonButton.getString("media_id"));
        } else if (type.equals(ButtonType.Miniprogram.toString())) {
            //小程序菜单
            singleButton = new MiniprogramButton(jsonButton.getString("name"), jsonButton.getString("appid"),
                    jsonButton.getString("pagepath"), jsonButton.getString("url"));
        }
        if (jsonButton.containsKey("sub_button")) {
            JSONArray sub_button = jsonButton.getJSONArray("sub_button");
            //判断是否存在子菜单
            if (!sub_button.isEmpty()) {
                //如果不为空,则添加到singleButton中
                for (int i = 0; i < sub_button.size(); i++) {
                    JSONObject jsonSubButton = sub_button.getJSONObject(i);
                    recursion(jsonSubButton, singleButton);
                }
            }
        }
        //判断是否存在子菜单
        if (menuButton == null) {
            //只添加一级菜单到集合中
            button.add(singleButton);
        } else {
            //添加到二级自定义菜单中
            menuButton.getSubButton().add(singleButton);
        }
    }

    /**
     * 转成JSON提交对象
     *
     * @return JSON提交对象
     */
    public JSONObject toJSONObject() {
        JSONObject buttonJson = new JSONObject();
        JSONArray buttonArray = new JSONArray();
        if (this.button != null) {
            //添加一级菜单
            for (SingleButton btn : button) {
                List<SingleButton> subButton = btn.getSubButton();
                //设置顶级菜单信息
                JSONObject btnJson = new JSONObject();
                btnJson.put("name", btn.getName());
                if (btn instanceof ViewButton) {
                    ViewButton cBtn = (ViewButton) btn;
                    btnJson.put("type", cBtn.getType());
                    btnJson.put("url", cBtn.getUrl());
                } else if (btn instanceof ClickButton) {
                    ClickButton cBtn = (ClickButton) btn;
                    btnJson.put("type", cBtn.getType());
                    btnJson.put("key", cBtn.getKey());
                } else if (btn instanceof ScancodePushButton) {
                    ScancodePushButton cBtn = (ScancodePushButton) btn;
                    btnJson.put("type", cBtn.getType());
                    btnJson.put("key", cBtn.getKey());
                } else if (btn instanceof ScancodeWaitMsgButton) {
                    ScancodeWaitMsgButton cBtn = (ScancodeWaitMsgButton) btn;
                    btnJson.put("type", cBtn.getType());
                    btnJson.put("key", cBtn.getKey());
                } else if (btn instanceof PicSysPhotoButton) {
                    PicSysPhotoButton cBtn = (PicSysPhotoButton) btn;
                    btnJson.put("type", cBtn.getType());
                    btnJson.put("key", cBtn.getKey());
                } else if (btn instanceof PicPhotoOrAlbumButton) {
                    PicPhotoOrAlbumButton cBtn = (PicPhotoOrAlbumButton) btn;
                    btnJson.put("type", cBtn.getType());
                    btnJson.put("key", cBtn.getKey());
                } else if (btn instanceof PicWeixinButton) {
                    PicWeixinButton cBtn = (PicWeixinButton) btn;
                    btnJson.put("type", cBtn.getType());
                    btnJson.put("key", cBtn.getKey());
                } else if (btn instanceof LocationSelectButton) {
                    LocationSelectButton cBtn = (LocationSelectButton) btn;
                    btnJson.put("type", cBtn.getType());
                    btnJson.put("key", cBtn.getKey());
                } else if (btn instanceof MediaIdButton) {
                    MediaIdButton cBtn = (MediaIdButton) btn;
                    btnJson.put("type", cBtn.getType());
                    btnJson.put("media_id", cBtn.getMedia_Id());
                } else if (btn instanceof ViewLimitedButton) {
                    ViewLimitedButton cBtn = (ViewLimitedButton) btn;
                    btnJson.put("type", cBtn.getType());
                    btnJson.put("media_id", cBtn.getMedia_Id());
                } else if (btn instanceof MiniprogramButton) {
                    MiniprogramButton cBtn = (MiniprogramButton) btn;
                    btnJson.put("type", cBtn.getType());
                    btnJson.put("url", cBtn.getUrl());
                    btnJson.put("appid", cBtn.getAppid());
                    btnJson.put("pagepath", cBtn.getPagepath());
                }
                //设置子菜单信息
                JSONArray subButtonArray = new JSONArray();
                for (SingleButton subBtn : subButton) {
                    JSONObject subBtnJson = new JSONObject();
                    subBtnJson.put("name", subBtn.getName());
                    if (subBtn instanceof ViewButton) {
                        ViewButton cBtn = (ViewButton) subBtn;
                        subBtnJson.put("type", cBtn.getType());
                        subBtnJson.put("url", cBtn.getUrl());
                    } else if (subBtn instanceof ClickButton) {
                        ClickButton cBtn = (ClickButton) subBtn;
                        subBtnJson.put("type", cBtn.getType());
                        subBtnJson.put("key", cBtn.getKey());
                    } else if (subBtn instanceof ScancodePushButton) {
                        ScancodePushButton cBtn = (ScancodePushButton) subBtn;
                        subBtnJson.put("type", cBtn.getType());
                        subBtnJson.put("key", cBtn.getKey());
                    } else if (subBtn instanceof ScancodeWaitMsgButton) {
                        ScancodeWaitMsgButton cBtn = (ScancodeWaitMsgButton) subBtn;
                        subBtnJson.put("type", cBtn.getType());
                        subBtnJson.put("key", cBtn.getKey());
                    } else if (subBtn instanceof PicSysPhotoButton) {
                        PicSysPhotoButton cBtn = (PicSysPhotoButton) subBtn;
                        subBtnJson.put("type", cBtn.getType());
                        subBtnJson.put("key", cBtn.getKey());
                    } else if (subBtn instanceof PicPhotoOrAlbumButton) {
                        PicPhotoOrAlbumButton cBtn = (PicPhotoOrAlbumButton) subBtn;
                        subBtnJson.put("type", cBtn.getType());
                        subBtnJson.put("key", cBtn.getKey());
                    } else if (subBtn instanceof PicWeixinButton) {
                        PicWeixinButton cBtn = (PicWeixinButton) subBtn;
                        subBtnJson.put("type", cBtn.getType());
                        subBtnJson.put("key", cBtn.getKey());
                    } else if (subBtn instanceof LocationSelectButton) {
                        LocationSelectButton cBtn = (LocationSelectButton) subBtn;
                        subBtnJson.put("type", cBtn.getType());
                        subBtnJson.put("key", cBtn.getKey());
                    } else if (subBtn instanceof MediaIdButton) {
                        MediaIdButton cBtn = (MediaIdButton) subBtn;
                        subBtnJson.put("type", cBtn.getType());
                        subBtnJson.put("media_id", cBtn.getMedia_Id());
                    } else if (subBtn instanceof ViewLimitedButton) {
                        ViewLimitedButton cBtn = (ViewLimitedButton) subBtn;
                        subBtnJson.put("type", cBtn.getType());
                        subBtnJson.put("media_id", cBtn.getMedia_Id());
                    } else if (subBtn instanceof MiniprogramButton) {
                        MiniprogramButton cBtn = (MiniprogramButton) subBtn;
                        subBtnJson.put("type", cBtn.getType());
                        subBtnJson.put("url", cBtn.getUrl());
                        subBtnJson.put("appid", cBtn.getAppid());
                        subBtnJson.put("pagepath", cBtn.getPagepath());
                    }
                    subButtonArray.add(subBtnJson);
                }
                btnJson.put("sub_button", subButtonArray);
                buttonArray.add(btnJson);
            }
        }
        buttonJson.put("button", buttonArray);
        //返回创建JSON BODY
        return buttonJson;
    }

    public List<SingleButton> getButton() {
        if (button == null) {
            button = new ArrayList<SingleButton>(0);
        }
        return button;
    }

    public void setButton(List<SingleButton> button) {
        this.button = button;
    }
}