<template>
  <div>
    <div class="text-center">
      <table id="providers">
        <tr>
          <th>{{ $strings.LabelName }}</th>
          <th>{{ $strings.LabelUrl }}</th>
          <th>{{ $strings.LabelApiKey }}</th>
          <th class="w-12"></th>
        </tr>
        <tr v-for="provider in providers" :key="provider.id">
          <td class="text-sm">{{ provider.name }}</td>
          <td class="text-sm">{{ provider.url }}</td>
          <td class="text-sm">
            <span class="custom-provider-api-key">{{ provider.apiKey }}</span>
          </td>
          <td class="py-0">
            <div class="h-8 w-8 flex items-center justify-center text-white text-opacity-50 hover:text-error cursor-pointer" @click.stop="removeProvider(provider)">
              <button type="button" :aria-label="$strings.ButtonDelete" class="material-icons text-base">delete</button>
            </div>
          </td>
        </tr>
      </table>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      providers: [],
    }
  },
  methods: {
    addedProvider(provider) {
      if (!Array.isArray(this.providers)) return

      this.providers.push(provider)
    },
    removedProvider(provider) {
      this.providers = this.providers.filter((p) => p.id !== provider.id)
    },
    removeProvider(provider) {
      this.$axios
          .$delete(`/api/custom-metadata-providers/admin/${provider.id}`)
          .then((data) => {
            if (data.error) {
              this.$toast.error(`Failed to remove provider: ${data.error}`)
            } else {
              this.$toast.success('Provider removed')
            }
          })
          .catch((error) => {
            console.error('Failed to remove provider', error)
            this.$toast.error('Failed to remove provider')
          })
    },
    loadProviders() {
      this.$axios.$get('/api/custom-metadata-providers/admin')
          .then((res) => {
            this.providers = res.providers
          })
          .catch((error) => {
            console.error('Failed', error)
          })
    },
    init(attempts = 0) {
      if (!this.$root.socket) {
        if (attempts > 10) {
          return console.error('Failed to setup socket listeners')
        }
        setTimeout(() => {
          this.init(++attempts)
        }, 250)
        return
      }
      this.$root.socket.on('custom_metadata_provider_added', this.addedProvider)
      this.$root.socket.on('custom_metadata_provider_removed', this.removedProvider)
    }
  },
  mounted() {
    this.loadProviders()
    this.init()
  },
  beforeDestroy() {
    if (this.$refs.addModal) {
      this.$refs.addModal.close()
    }

    if (this.$root.socket) {
      this.$root.socket.off('custom_metadata_provider_added', this.addedProvider)
      this.$root.socket.off('custom_metadata_provider_removed', this.removedProvider)
    }
  }
}
</script>

<style>
#providers {
  table-layout: fixed;
  border-collapse: collapse;
  border: 1px solid #474747;
  width: 100%;
}

#providers td,
#providers th {
  /* border: 1px solid #2e2e2e; */
  padding: 8px 8px;
  text-align: left;
}

#providers td.py-0 {
  padding: 0px 8px;
}

#providers tr:nth-child(even) {
  background-color: #373838;
}

#providers tr:nth-child(odd) {
  background-color: #2f2f2f;
}

#providers tr:hover {
  background-color: #444;
}

#providers th {
  font-size: 0.8rem;
  font-weight: 600;
  padding-top: 5px;
  padding-bottom: 5px;
  background-color: #272727;
}

.custom-provider-api-key {
  padding: 1px;
  background-color: #272727;
  border-radius: 4px;
  color: transparent;
  transition: color, background-color 0.5s ease;
}

.custom-provider-api-key:hover {
  background-color: transparent;
  color: white;
}
</style>