content: /*
   * 微信公众平台(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;
      }
  }
  