<template>
  <b-modal id="add-destination" ref="modal" @ok="onOk" @hidden="resetForm">
    <template #modal-title>
      {{ $t('pageSnmpAlerts.modal.addSnmpDestinationTitle') }}
    </template>
    <b-form id="form-destination">
      <b-container>
        <b-row>
          <b-col sm="6">
            <!-- Add new SNMP alert destination type -->
            <b-form-group
              :label="$t('pageSnmpAlerts.modal.ipaddress')"
              label-for="ip-address"
            >
              <b-form-input
                id="ip-Address"
                v-model="form.ipAddress"
                :state="getValidationState(v$.form.ipAddress)"
                data-test-id="snmpAlerts-input-ipAddress"
                type="text"
                @blur="v$.form.ipAddress.$touch()"
              />

              <b-form-invalid-feedback role="alert">
                <template v-if="v$.form.ipAddress.required.$invalid">
                  {{ $t('global.form.fieldRequired') }}
                </template>
                <template v-if="v$.form.ipAddress.ipAddress.$invalid">
                  {{ $t('global.form.invalidFormat') }}
                </template>
              </b-form-invalid-feedback>
            </b-form-group>
          </b-col>
          <b-col>
            <b-form-group label-for="port">
              <template #label>
                {{ $t('pageSnmpAlerts.modal.port') }} -
                <span class="form-text d-inline">
                  {{ $t('global.form.optional') }}
                </span>
              </template>
              <b-form-input
                id="port"
                v-model="form.port"
                type="text"
                :state="getValidationState(v$.form.port)"
                data-test-id="snmpAlerts-input-port"
                @blur="v$.form.port.$touch()"
              />
              <b-form-invalid-feedback role="alert">
                <template
                  v-if="!v$.form.port.minLength || !v$.form.port.maxLength"
                >
                  {{
                    $t('global.form.valueMustBeBetween', {
                      min: 0,
                      max: 65535,
                    })
                  }}
                </template>
              </b-form-invalid-feedback>
            </b-form-group>
          </b-col>
        </b-row>
      </b-container>
    </b-form>
    <template #modal-footer="{ cancel }">
      <b-button variant="secondary" @click="cancel()">
        {{ $t('global.action.cancel') }}
      </b-button>
      <b-button
        form="form-user"
        type="submit"
        variant="primary"
        data-test-id="snmpAlerts-button-ok"
        @click="onOk"
      >
        {{ $t('pageSnmpAlerts.addDestination') }}
      </b-button>
    </template>
  </b-modal>
</template>

<script>
import { required, ipAddress, minValue, maxValue } from '@vuelidate/validators';
import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
import { useVuelidate } from '@vuelidate/core';
import { useI18n } from 'vue-i18n';

export default {
  mixins: [VuelidateMixin],
  setup() {
    return {
      v$: useVuelidate(),
    };
  },
  data() {
    return {
      $t: useI18n().t,
      form: {
        ipaddress: null,
        port: null,
      },
    };
  },
  validations() {
    return {
      form: {
        ipAddress: {
          required,
          ipAddress,
        },
        port: {
          minValue: minValue(0),
          maxValue: maxValue(65535),
        },
      },
    };
  },
  methods: {
    handleSubmit() {
      this.v$.$touch();
      if (this.v$.$invalid) return;
      this.$emit('ok', {
        ipAddress: this.form.ipAddress,
        port: this.form.port,
      });
      this.closeModal();
    },
    closeModal() {
      this.$nextTick(() => {
        this.$refs.modal.hide();
      });
    },
    resetForm() {
      this.form.ipAddress = '';
      this.form.port = '';
      this.v$.$reset();
      this.$emit('hidden');
    },
    onOk(bvModalEvt) {
      // prevent modal close
      bvModalEvt.preventDefault();
      this.handleSubmit();
    },
  },
};
</script>
