<StateChart @src={{chart}} as |State Guard Action dispatch state|>
  {{yield (hash
    reset=(action dispatch "RESET")
    focus=(action 'focus')
  )}}
  <Guard @name="hasValue" @cond={{action 'hasValue'}} />
  {{!FIXME: Call this reset or similar }}
  <Action @name="clearError" @exec={{queue (action (mut error) undefined) (action (mut secret) undefined)}} />
  <div class="auth-form" ...attributes>
    <State @matches="error">
      {{#if error.status}}
        <p role="alert" class="notice error">
          {{#if value.Name}}
            {{#if (eq error.status '403')}}
              <strong>Consul login failed</strong><br />
              We received a token from your OIDC provider but could not log in to Consul with it.
            {{else if (eq error.status '401')}}
              <strong>Could not log in to provider</strong><br />
              The OIDC provider has rejected this access token. Please have an administrator check your auth method configuration.
            {{else if (eq error.status '499')}}
              <strong>SSO log in window closed</strong><br />
              The OIDC provider window was closed. Please try again.
            {{else}}
              <strong>Error</strong><br />
              {{error.detail}}
            {{/if}}
          {{else}}
            {{#if (eq error.status '403')}}
              <strong>Invalid token</strong><br />
              The token entered does not exist. Please enter a valid token to log in.
            {{else}}
              <strong>Error</strong><br />
              {{error.detail}}
            {{/if}}
          {{/if}}
        </p>
      {{/if}}
    </State>
    <form onsubmit={{action dispatch "SUBMIT"}}>
      <fieldset>
        <label class={{concat "type-password" (if (and (state-matches state 'error') (not error.status)) ' has-error' '')}}>
          <span>Log in with a token</span>
          <input
            {{ref this 'input'}}
            disabled={{state-matches state "loading"}}
            type={{inputType}}
            name="auth[SecretID]"
            placeholder="SecretID"
            value={{secret}}
            oninput={{queue
              (action (mut secret) value="target.value")
              (action (mut value) value="target.value")
              (action dispatch "TYPING")
            }}
          />
          <State @matches="error">
            {{#if (not error.status)}}
              <strong role="alert">
                Please enter your secret
              </strong>
            {{/if}}
          </State>
        </label>
      </fieldset>
      <button type="submit" disabled={{state-matches state "loading"}}>
        Log in
      </button>
      <em>Contact your administrator for login credentials.</em>
    </form>
{{#if (env 'CONSUL_SSO_ENABLED')}}
    <DataSource
      @src={{concat '/' (or nspace 'default') '/' dc '/oidc/providers'}}
      @onchange={{queue (action (mut providers) value="data")}}
      @onerror={{queue (action (mut error) value="error.errors.firstObject")}}
      @loading="lazy"
    />
  {{#if (gt providers.length 0)}}
    <p>
      <span>or</span>
    </p>
  {{/if}}
  <OidcSelect
    @items={{providers}}
    @disabled={{state-matches state "loading"}}
    @onchange={{queue (action (mut value)) (action dispatch "SUBMIT") }}
    @onerror={{queue (action (mut error) value="error.errors.firstObject") (action dispatch "ERROR")}}
  />
{{/if}}
  </div>
  <State @matches="loading">
    <TokenSource
      @dc={{dc}}
      @nspace={{or value.Namespace nspace}}
      @type={{if value.Name 'oidc' 'secret'}}
      @value={{if value.Name value.Name value}}
      @onchange={{queue (action dispatch "RESET") (action onsubmit)}}
      @onerror={{queue (action (mut error) value="error.errors.firstObject") (action dispatch "ERROR")}}
    />
  </State>
</StateChart>