/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
#ifndef WEEX_PROJECT_WXCOREENVIRONMENT_H
#define WEEX_PROJECT_WXCOREENVIRONMENT_H
#include "core/api/wx_api.h"
#include <string>
#include <map>

namespace WeexCore {

  class WX_EXPORT WXCoreEnvironment {

  private:

    WXCoreEnvironment() {}

    ~WXCoreEnvironment() {}

    static WXCoreEnvironment *m_pInstance;

    //just to release singleton object
    class Garbo {
    public:
      ~Garbo() {
        if (WXCoreEnvironment::m_pInstance) {
          delete WXCoreEnvironment::m_pInstance;
        }
      }
    };

    static Garbo garbo;

    std::string mPlatformName;

    float mDeviceWidth;

    float mDeviceHeight;

    std::map<std::string, std::string> mOptions;

    bool mInteractionLogSwitch;

    bool mUseRuntimeApi;

  public:

    bool SetPlatform(std::string platformName);

    inline std::string platform() {
        return mPlatformName;
    }

    bool IsAndroid();

    bool IsIOS();

    bool SetDeviceWidth(const std::string &width);

    bool SetDeviceHeight(const std::string &height);

    inline void set_device_height(float height) {
        mDeviceHeight = height;
    }

    inline void set_device_width(float width) {
        mDeviceWidth = width;
    }

    inline bool isInteractionLogOpen(){
        return mInteractionLogSwitch;
    }

    const float DeviceWidth();

    const float DeviceHeight();

    const std::string GetOption(const std::string &key);

    const std::map<std::string, std::string> &options();

    bool isUseRunTimeApi();

    void setUseRunTimeApi(bool useRuntimeApi);

    void AddOption(std::string key, std::string value);
    void PutOption(std::string key, std::string value);

    static WXCoreEnvironment *getInstance() {
      if (!m_pInstance) {
        m_pInstance = new WXCoreEnvironment();
      }
      return m_pInstance;
    }
  };
}

#endif //WEEX_PROJECT_WXCOREENVIRONMENT_H
