<template>
  <div class="modal-card box box-modal is-wallet-modal">
    <header class="box-modal-header is-spaced">
      <p class="box-modal-title has-text-centered">{{ $t('changeNetwork') }}</p>
      <button class="delete" type="button" @click="$emit('close')" />
    </header>
    <div class="networks">
      <div
        v-for="{ name, chainId } in networks"
        :key="chainId"
        class="item"
        :class="{ 'is-active': chainId === netId }"
        @click="setNetwork(chainId)"
      >
        <b-icon class="network-icon" :icon="`${name}`.replace(/\)?\s\(?/g, '-').toLowerCase()" />
        <b>{{ name }}</b>
        <span class="network-checkbox"></span>
      </div>
    </div>
  </div>
</template>
<script>
import { mapState, mapActions, mapGetters } from 'vuex'
import config from '@/networkConfig'

export default {
  data() {
    return {
      isLoading: false,
      networkConfig: config
    }
  },
  computed: {
    ...mapGetters('metamask', ['netId', 'isLoggedIn']),
    ...mapState('metamask', ['isInitialized']),
    networks() {
      return Object.keys(this.networkConfig).map((key) => {
        return {
          name: this.networkConfig[key].networkName,
          chainId: Number(key.replace('netId', ''))
        }
      })
    }
  },
  methods: {
    ...mapActions('metamask', ['networkChangeHandler']),
    ...mapActions('loading', ['enable', 'disable']),
    async setNetwork(netId) {
      this.enable({ message: this.$t('changingNetwork') })

      await this.sleep()

      try {
        const providerName = window.localStorage.getItem('provider')
        const isSupport = this.checkSupportNetwork(netId)

        if (isSupport) {
          await this.networkChangeHandler({ netId })

          if (!providerName) {
            this.$router.go(0)
          }
        }
      } catch (err) {
        console.log(`setNetwork has error ${err.message}`)
      } finally {
        this.$emit('close')
        this.disable()
      }
    },
    sleep() {
      return new Promise((resolve) =>
        setTimeout(() => {
          resolve()
        }, 800)
      )
    },
    checkSupportNetwork(netId) {
      const isSupport = Object.keys(this.networkConfig).includes(`netId${netId}`)

      if (!isSupport) {
        this.$buefy.snackbar.open({
          message: this.$i18n.t('currentNetworkIsNotSupported'),
          type: 'is-primary',
          position: 'is-top',
          indefinite: true,
          actionText: 'Ok'
        })
      }

      return isSupport
    }
  }
}
</script>
<style lang="scss" scoped>
.box-modal {
  max-width: 300px;
  margin: 0 auto !important;
}
.item {
  cursor: pointer;
  text-align: center;
  margin: 14px 0;
  display: flex;
  align-items: center;
  font-size: 0.929rem;

  b {
    font-weight: 400;
  }

  .network-icon {
    margin-right: 12px;

    ::v-deep .trnd {
      height: 1.571rem;
      width: 1.571rem;
    }
  }

  .network-checkbox {
    margin-left: auto;
    height: 22px;
    width: 22px;
    border-radius: 100%;
    border: 1px solid #6b6b6b;
    transition: border-color 0.15s ease-in-out;
  }

  &.is-active {
    .network-checkbox {
      border-color: #94febf;
      background-color: #94febf;
      background-image: url('../assets/img/icons/checkbox.svg');
      background-position: center;
      background-repeat: no-repeat;
    }
  }

  &:hover {
    .network-checkbox {
      border-color: #94febf;
    }
  }
}
</style>