import { BPopover } from '../../../vendor/bootstrap-vue/src/components/popover/popover';
import tooltipMixin from '../../mixins/tooltip_mixin';
import CloseButton from '../../shared_components/close_button/close_button';
import { popoverPlacements } from '../../../utils/constants';
import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';

const popoverRefName = 'bPopover';
var script = {
  name: 'GlPopover',
  components: {
    BPopover,
    CloseButton
  },
  mixins: [tooltipMixin(popoverRefName)],
  inheritAttrs: false,
  props: {
    /**
     * Additional CSS class(es) to apply to the popover.
     */
    cssClasses: {
      type: [Array, String, Object],
      required: false,
      default: ''
    },
    /**
     * Space-separated triggers for the popover.
     *
     * @values click, hover, focus, manual
     */
    triggers: {
      type: String,
      required: false,
      default: 'hover focus'
    },
    /**
     * Title text to display in the popover header.
     */
    title: {
      type: String,
      required: false,
      default: ''
    },
    /**
     * When true, displays a close button in the popover header.
     */
    showCloseButton: {
      type: Boolean,
      required: false,
      default: false
    },
    /**
     * Placement of the popover relative to the target element.
     */
    placement: {
      type: String,
      required: false,
      default: popoverPlacements.top
    },
    /**
     * Padding (in pixels) between the popover and the viewport boundary.
     */
    boundaryPadding: {
      type: [Number, String],
      required: false,
      default: 5
    }
  },
  computed: {
    hasTitle() {
      return this.$scopedSlots.title || this.title;
    },
    customClass() {
      return ['gl-popover', this.hasTitle && 'has-title', this.showCloseButton && 'has-close-button', ...this.normalizedCssClasses(this.cssClasses)].filter(Boolean).join(' ');
    },
    shouldShowTitle() {
      return this.hasTitle || this.showCloseButton;
    }
  },
  methods: {
    /**
     * `cssClasses can be a string, an array, or an object. This method normalizes it to an array
     */
    normalizedCssClasses(cssClasses) {
      if (Array.isArray(cssClasses)) {
        return cssClasses;
      }
      if (typeof cssClasses === 'string') {
        return cssClasses.trim() ? cssClasses.trim().split(/\s+/) : [];
      }
      if (cssClasses && typeof cssClasses === 'object') {
        return Object.keys(cssClasses).filter(key => cssClasses[key]);
      }
      return [];
    },
    close(e) {
      this.$refs[popoverRefName].doClose();
      /**
       * Emitted when the close button is clicked (requires showCloseButton to be `true`).
       */
      this.$emit('close-button-clicked', e);
    }
  },
  popoverRefName
};

/* script */
const __vue_script__ = script;

/* template */
var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('b-popover',_vm._g(_vm._b({ref:_vm.$options.popoverRefName,attrs:{"custom-class":_vm.customClass,"triggers":_vm.triggers,"title":_vm.title,"placement":_vm.placement,"boundary-padding":_vm.boundaryPadding},scopedSlots:_vm._u([(_vm.shouldShowTitle)?{key:"title",fn:function(){return [_vm._t("title",function(){return [_vm._v("\n      "+_vm._s(_vm.title)+"\n    ")]}),_vm._v(" "),(_vm.showCloseButton)?_c('div',{staticClass:"-gl-mr-3 -gl-mt-2 gl-ml-3 gl-h-0"},[_c('close-button',{class:{ 'gl-float-right gl-mt-2': !_vm.hasTitle },attrs:{"data-testid":"close-button"},on:{"click":_vm.close}})],1):_vm._e()]},proxy:true}:null,(_vm.$scopedSlots.default)?{key:"default",fn:function(){return [_vm._t("default")]},proxy:true}:null],null,true)},'b-popover',_vm.$attrs,false),_vm.$listeners))};
var __vue_staticRenderFns__ = [];

  /* style */
  const __vue_inject_styles__ = undefined;
  /* scoped */
  const __vue_scope_id__ = undefined;
  /* module identifier */
  const __vue_module_identifier__ = undefined;
  /* functional template */
  const __vue_is_functional_template__ = false;
  /* style inject */
  
  /* style inject SSR */
  
  /* style inject shadow dom */
  

  
  const __vue_component__ = /*#__PURE__*/__vue_normalize__(
    { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
    __vue_inject_styles__,
    __vue_script__,
    __vue_scope_id__,
    __vue_is_functional_template__,
    __vue_module_identifier__,
    false,
    undefined,
    undefined,
    undefined
  );

export { __vue_component__ as default };
