{{!
  Copyright (c) HashiCorp, Inc.
  SPDX-License-Identifier: BUSL-1.1
}}

{{yield}}
<StateChart @src={{this.chart}} as |State Guard Action dispatch state|>
  <Ref @target={{this}} @name="dispatch" @value={{dispatch}} />
  <Guard @name="loaded" @cond={{action "isLoaded"}} />


{{#let (hash
  data=this.data
  error=this.error
  invalidate=this.invalidate
  dispatchError=(queue (action (mut this.error) value="error.errors.firstObject") (action dispatch "ERROR"))
) as |api|}}

    {{#yield-slot name="data"}}
      {{yield api}}
    {{else}}
      {{! if we didn't specify any data}}
      {{#if (not @items)}}
        {{! try and load the data if we aren't in an error state}}
        <State @notMatches={{array "error" "disconnected"}}>
          {{! but only if we only asked for a single load and we are in loading state}}
          {{#if (and @src (or (not @once) (state-matches state "loading")))}}
            <DataSource
              @open={{@open}}
              @src={{@src}}
              @onchange={{queue (action "change" value="data") (action dispatch "SUCCESS")}}
              @onerror={{api.dispatchError}}
            as |source|>
              {{did-insert (set this 'invalidate' source.invalidate)}}
            </DataSource>
          {{/if}}
        </State>
      {{/if}}
    {{/yield-slot}}

  <State @matches="loading">
    {{#yield-slot name="loading"}}
      {{yield api}}
    {{else}}
      <Consul::Loader />
    {{/yield-slot}}
  </State>

  <State @matches="error">
    {{#yield-slot name="error"}}
      {{yield api}}
    {{else}}
      <ErrorState @error={{this.error}} />
    {{/yield-slot}}
  </State>

  <State @matches={{array "idle" "disconnected"}}>

    <State @matches="disconnected">
      {{#if (not (eq this.error.status '401'))}}
        {{#yield-slot name="disconnected" params=(block-params (action dispatch "RESET"))}}
            {{yield api}}
        {{else}}
          <Hds::Toast @color='warning'
            {{notification
              sticky=true
            }} as |T|>
            <T.Title>Warning!</T.Title>
            <T.Description>An error was returned whilst loading this data, refresh to try again.</T.Description>
          </Hds::Toast>
        {{/yield-slot}}
      {{/if}}
    </State>
    {{#if (eq this.error.status "403")}}
      {{#yield-slot name="error"}}
        {{yield api}}
      {{else}}
        <ErrorState @error={{this.error}} />
      {{/yield-slot}}
    {{else}}
      <YieldSlot @name="loaded">
        {{yield api}}
      </YieldSlot>
    {{/if}}

  </State>

{{/let}}
  {{did-update (fn dispatch "LOAD") src=@src}}
</StateChart>