// 可以引入这个插件包内的脚本文件、组件文件
import UIPanel from './components/UIPanel'
import GlobalLight from './components/GlobalLight'
import DayNight from './components/DayNight'

/**
 * 插件类，该插件可以切换天气（默认（晴）、雨、雪）
 */
class WeatherSwitch extends THING.BasePlugin {
  constructor() {
    super()
    /**
     * @public
     * @widgetAlias 显示属性面板
     * @widgetType switch
     * @description 是否显示默认UI面板
     */
    this.showDefaultPanel = true

    /**
     * @public
     * @widgetAlias 默认天气
     * @widgetType text
     */
    this.defaultWeather = 'sunny'

    /**
     * @public
     * @widgetType slider
     * @widgetAlias 粒子密度
     * @widgetParam {number} [min=0.1]
     * @widgetParam {number} [max=1]
     * @widgetParam {string} [placeholder=雨/雪等粒子密度]
     */
    this.intensity = 0.1

    /**
     * @public
     * @widgetType {text}
     * @widgetParam {string} [placeholder=粒子沿中心位置的偏移]
     */
    this.offset = '[0, 0, 0]'
    // this._defaultOptions = {
    //   showDefaultPanel: true,
    //   defaultWeather: 'sunny',
    //   // minParticleDensity: '500', // 粒子最小密度 默认500   thingjs2.0还不支持
    //   // maxParticleDensity: '1000', // 粒子最大密度 默认1000  thingjs2.0还不支持
    //   offset: [0, 0, 0],
    //   intensity: 0.1,
    // }
  }

  /**
   * 安装插件
   * @param {Object} options 插件配置
   * @param {Boolean} [options.showDefaultPanel=true] 是否显示插件自带的测量面板和按钮，默认显示
   * @param {WeatherSwitch.WeatherType} [options.defaultWeather=''] ，默认选中的天气，可选值
   * @param {Array} [options.offset=[0, 30, -30]] 粒子相对于摄像机的偏移
   * @param {Number} [options.intensity=0.1] 下雨/雪时的周边亮度
   * @memberof WeatherSwitch
   */
  onInstall(options = {}) {
    if (!this._isObject(options)) {
      throw new Error(`天气切换插件配置参数 options 必须为对象`)
    }

    this.options = Object.assign({}, this, options)
    this.options.offset = JSON.parse(this.options.offset)
    this.options._baseUrl = this.bundle.resolveURL('/')

    // 回调方法
    this._tool = new THING.Entity()

    this._tool.addComponent(DayNight, 'dayNight', this.options)
    this._tool.addComponent(UIPanel, 'uiPanel', this.options)
    this._tool.addComponent(GlobalLight, 'globalLight', this.options)
  }

  /**
   * 判断是否为对象
   * @param {Object} o 参数
   */
  _isObject(o) {
    return Object.prototype.toString.call(o) === '[object Object]'
  }

  // 卸载这个插件包时，调用的方法
  onUninstall() {
    this._tool.destroy()
  }

  // // 用户如果不用默认自带的工具按钮，那就需要代码调用下面的方法，来激活测量工作

  /**
   * @public
   * @description 设置天气
   * @widgetAlias 设置天气
   * @param {string} type 效果名称(sunny, rainy, snowy), 不填写默认是晴天无效果
   */
  setWeather(type = 'sunny') {
    this._tool.uiPanel.createEffect(type)
  }

  /**
   * @public
   * @description 重置天气
   */
  resetWeather() {
    this._tool.uiPanel.resetEffect()
  }

  get WeatherType() {
    return {
      Sunny: 'sunny',
      Rainy: 'rainy',
      Snowy: 'snowy',
    }
  }
}
