async function stallList(path) {
  const template = await loadTemplateAsync(path)
  Vue.component('stall-list', {
    name: 'stall-list',
    template,

    props: [`adminkey`, 'inkey', 'wallet-options'],
    data: function () {
      return {
        filter: '',
        stalls: [],
        pendingStalls: [],
        currencies: [],
        stallDialog: {
          show: false,
          showRestore: false,
          data: {
            name: '',
            description: '',
            wallet: null,
            currency: 'sat',
            shippingZones: []
          }
        },
        zoneOptions: [],
        stallsTable: {
          columns: [
            {
              name: '',
              align: 'left',
              label: '',
              field: ''
            },
            {
              name: 'id',
              align: 'left',
              label: 'Name',
              field: 'id'
            },
            {
              name: 'currency',
              align: 'left',
              label: 'Currency',
              field: 'currency'
            },
            {
              name: 'description',
              align: 'left',
              label: 'Description',
              field: 'description'
            },
            {
              name: 'shippingZones',
              align: 'left',
              label: 'Shipping Zones',
              field: 'shippingZones'
            }
          ],
          pagination: {
            rowsPerPage: 10
          }
        }
      }
    },
    computed: {
      filteredZoneOptions: function () {
        return this.zoneOptions.filter(
          z => z.currency === this.stallDialog.data.currency
        )
      }
    },
    methods: {
      sendStallFormData: async function () {
        const stallData = {
          name: this.stallDialog.data.name,
          wallet: this.stallDialog.data.wallet,
          currency: this.stallDialog.data.currency,
          shipping_zones: this.stallDialog.data.shippingZones,
          config: {
            description: this.stallDialog.data.description
          }
        }
        if (this.stallDialog.data.id) {
          stallData.id = this.stallDialog.data.id
          await this.restoreStall(stallData)
        } else {
          await this.createStall(stallData)
        }

      },
      createStall: async function (stall) {
        try {
          const { data } = await LNbits.api.request(
            'POST',
            '/nostrmarket/api/v1/stall',
            this.adminkey,
            stall
          )
          this.stallDialog.show = false
          data.expanded = false
          this.stalls.unshift(data)
          this.$q.notify({
            type: 'positive',
            message: 'Stall created!'
          })
        } catch (error) {
          LNbits.utils.notifyApiError(error)
        }
      },
      restoreStall: async function (stallData) {
        try {
          stallData.pending = false
          const { data } = await LNbits.api.request(
            'PUT',
            `/nostrmarket/api/v1/stall/${stallData.id}`,
            this.adminkey,
            stallData
          )
          this.stallDialog.show = false
          data.expanded = false
          this.stalls.unshift(data)
          this.$q.notify({
            type: 'positive',
            message: 'Stall restored!'
          })
        } catch (error) {
          LNbits.utils.notifyApiError(error)
        }
      },
      deleteStall: async function (pendingStall) {
        LNbits.utils
          .confirmDialog(
            `
           Are you sure you want to delete this pending stall '${pendingStall.name}'?
          `
          )
          .onOk(async () => {
            try {
              await LNbits.api.request(
                'DELETE',
                '/nostrmarket/api/v1/stall/' + pendingStall.id,
                this.adminkey
              )
              this.$q.notify({
                type: 'positive',
                message: 'Pending Stall Deleted',
                timeout: 5000
              })
            } catch (error) {
              console.warn(error)
              LNbits.utils.notifyApiError(error)
            }
          })
      },
      getCurrencies: async function () {
        try {
          const { data } = await LNbits.api.request(
            'GET',
            '/nostrmarket/api/v1/currencies',
            this.inkey
          )

          return ['sat', ...data]
        } catch (error) {
          LNbits.utils.notifyApiError(error)
        }
        return []
      },
      getStalls: async function (pending = false) {
        try {
          const { data } = await LNbits.api.request(
            'GET',
            `/nostrmarket/api/v1/stall?pending=${pending}`,
            this.inkey
          )
          return data.map(s => ({ ...s, expanded: false }))
        } catch (error) {
          LNbits.utils.notifyApiError(error)
        }
        return []
      },
      getZones: async function () {
        try {
          const { data } = await LNbits.api.request(
            'GET',
            '/nostrmarket/api/v1/zone',
            this.inkey
          )
          return data.map(z => ({
            ...z,
            label: z.name
              ? `${z.name} (${z.countries.join(', ')})`
              : z.countries.join(', ')
          }))
        } catch (error) {
          LNbits.utils.notifyApiError(error)
        }
        return []
      },
      handleStallDeleted: function (stallId) {
        this.stalls = _.reject(this.stalls, function (obj) {
          return obj.id === stallId
        })
      },
      handleStallUpdated: function (stall) {
        const index = this.stalls.findIndex(r => r.id === stall.id)
        if (index !== -1) {
          stall.expanded = true
          this.stalls.splice(index, 1, stall)
        }
      },
      openCreateStallDialog: async function (stallData) {
        this.currencies = await this.getCurrencies()
        this.zoneOptions = await this.getZones()
        if (!this.zoneOptions || !this.zoneOptions.length) {
          this.$q.notify({
            type: 'warning',
            message: 'Please create a Shipping Zone first!'
          })
          return
        }
        this.stallDialog.data = stallData || {
          name: '',
          description: '',
          wallet: null,
          currency: 'sat',
          shippingZones: []
        }
        this.stallDialog.show = true
      },
      openSelectPendingStallDialog: async function () {
        this.stallDialog.showRestore = true
        this.pendingStalls = await this.getStalls(true)
      },
      openRestoreStallDialog: async function (pendingStall) {
        const shippingZonesIds = this.zoneOptions.map(z => z.id)
        await this.openCreateStallDialog({
          id: pendingStall.id,
          name: pendingStall.name,
          description: pendingStall.config?.description,
          currency: pendingStall.currency,
          shippingZones: (pendingStall.shipping_zones || [])
            .filter(z => shippingZonesIds.indexOf(z.id) !== -1)
            .map(z => ({
              ...z,
              label: z.name
                ? `${z.name} (${z.countries.join(', ')})`
                : z.countries.join(', ')
            }))
        })
      },
      customerSelectedForOrder: function (customerPubkey) {
        this.$emit('customer-selected-for-order', customerPubkey)
      },
      shortLabel(value = ''){
        if (value.length <= 64) return value
        return value.substring(0, 60) + '...'
      }
    },
    created: async function () {
      this.stalls = await this.getStalls()
      this.currencies = await this.getCurrencies()
      this.zoneOptions = await this.getZones()
    }
  })
}
