/**
 * 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.
 */

<template>
  <nav class="rk-dashboard-group">
    <span v-for="(i, index) in rocketComps.tree" :key="index" class="mr-15">
      <a class="rk-dashboard-group-i mb-10" @click="handleOption(index)" :class="{'active': rocketComps.group == index, 'grey': rocketComps.group != index}">{{i.name}}</a>
      <svg v-if="rocketGlobal.edit && rocketComps.group !== index" class="ml-5 icon cp red vm"  @click="DELETE_COMPS_GROUP(index)">
        <use xlink:href="#file-deletion"></use>
      </svg>
    </span>
    <a class="rk-dashboard-group-add" v-clickout="handleHide" v-if="rocketGlobal.edit">
      <svg class="icon vm" @click="show=!show">
        <use xlink:href="#todo-add"></use>
      </svg>
      <div class="rk-dashboard-group-add-box" v-if="show">
        <div class="mb-10 vm">{{$t('createGroup')}}</div>
        <div class="sm grey mb-5 mr-10">{{$t('groupType')}}</div>
        <select v-model="type" class="rk-dashboard-group-sel mb-5 long">
          <option value="service">{{$t('service')}}</option>
          <!-- <option value="proxy">Proxy</option> -->
          <option value="database">{{$t('database')}}</option>
        </select>
        <div class="sm grey  mb-5 mr-10">{{$t('groupName')}}</div>
        <input class="mb-5 rk-dashboard-group-input" type="text" v-model="name">
        <label class="mb-10 dib"><input type="checkbox" v-model="template">{{$t('template')}}</label>
        <a class="rk-btn r vm long tc" @click="handleCreate">{{$t('confirm')}}</a>
      </div>
    </a>
  </nav>
</template>

<script lang="ts">
import Vue from 'vue';
import { Component, Prop } from 'vue-property-decorator';
import { Mutation, Action, Getter } from 'vuex-class';

@Component({})
export default class ToolGroup extends Vue {
  @Prop() private rocketGlobal: any;
  @Prop() private rocketComps: any;
  @Mutation('DELETE_COMPS_GROUP') private DELETE_COMPS_GROUP: any;
  @Mutation('ADD_COMPS_GROUP') private ADD_COMPS_GROUP: any;
  @Action('MIXHANDLE_CHANGE_GROUP') private MIXHANDLE_CHANGE_GROUP: any;
  @Action('rocketOption/MIXHANDLE_GET_OPTION') private MIXHANDLE_GET_OPTION: any;
  @Getter('durationTime') private durationTime: any;
  private name: string = '';
  private type: string = 'service';
  private show: boolean = false;
  private template: boolean = false;
  private get compType() {
    return this.rocketComps.tree[this.rocketComps.group].type;
  }
  private handleOption(index: any) {
    this.MIXHANDLE_CHANGE_GROUP(index);
    return this.MIXHANDLE_GET_OPTION({compType: this.compType, duration: this.durationTime});
  }
  private handleHide() {
    this.name = '';
    this.type = 'service';
    this.show = false;
  }
  private handleCreate() {
    let template = 'nouse';
    if (this.type === 'service') {
      template = 'groupService';
    }
    if (this.type === 'database') {
      template = 'groupDatabase';
    }
    if (!this.template) {
      template = 'nouse';
    }
    this.ADD_COMPS_GROUP({name: this.name, type: this.type, template });
    this.handleHide();
    this.template = false;
  }
}
</script>

<style lang="scss" scoped>
.rk-dashboard-group{
  border-bottom:1px solid #252a2f;
  background-color: #333840;
  padding: 10px 15px 0;
  color: #eee;
}
.rk-dashboard-group-sel{
  outline: none;
  border: 0;
}
.rk-dashboard-group-add{
  position: relative;
}
.rk-dashboard-group-add-box{
  position: absolute;
  left: -10px;
  top: 35px;
  padding: 10px 5px;
  z-index: 2;
  border-radius: 4px;
  color: #eee;
  background-color: #252a2f;
  box-shadow: 0 3px 6px 0 rgba(0,0,0,.1), 0 1px 3px 0 rgba(0,0,0,.08);
}
.rk-dashboard-group-add-box:after {
	bottom: 100%;
	left: 10px;
	border: solid transparent;
	content: " ";
	height: 0;
	width: 0;
	position: absolute;
	pointer-events: none;
	border-color: rgba(136, 183, 213, 0);
	border-bottom-color: #252a2f;
	border-width: 8px;
	margin-left: 0px;
}
.rk-dashboard-group-input{
  border: 0;
  outline: 0;
  padding: 1px 8px;
  border-radius: 4px;
}
.rk-dashboard-group-i{
  display: inline-block;
  padding: 4px 13px 4px 15px;
  border-radius: 4px;
  position: relative;
  background-color: rgba(255, 255, 255, 0.07);
  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.08);
  will-change: border-color,color;
  transition: border-color .3s, color .3s;
  &.active::before{
    content: '';
    position: absolute;
    display: inline-block;
    width: 5px;
    height: 10px;
    border-radius: 4px;
    background-color: #448dfe;
    top: 9px;
    left: 4px;
  }
}
</style>
