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

<ChildSelector
  @disabled={{@disabled}}
  @repo={{this.repo}}
  @dc={{@dc}}
  @partition={{@partition}}
  @nspace={{@nspace}}
  @type='policy'
  @placeholder='Search for policy'
  @items={{@items}}
  {{fix-code-block-aria}}
  ...attributes
>
  {{yield}}
  <BlockSlot @name='label' data-test-apply-policy>
    Apply an existing policy
  </BlockSlot>
  <BlockSlot @name='create'>
    {{#yield-slot name='trigger'}}
      {{yield}}
    {{else}}
      <Hds::Button
        @text='Create new policy'
        @size='small'
        @color='tertiary'
        @icon='plus'
        class='type-dialog'
        data-test-policy-create
        {{on 'click' (action this.openModal)}}
      />
      {{!TODO: potentially call trigger something else}}
      {{!the modal has to go here so that if you provide a slot to trigger it doesn't get rendered}}
      <ModalDialog
        data-test-policy-form
        id='new-policy'
        @onopen={{action 'open'}}
        @aria={{hash label='New Policy'}}
        as |modal|
      >
        <Ref @target={{this}} @name='modal' @value={{modal}} />
        <BlockSlot @name='header'>
          <h2>New Policy</h2>
        </BlockSlot>
        <BlockSlot @name='body'>
          <PolicyForm
            @form={{this.form}}
            @nspace={{@nspace}}
            @partition={{@partition}}
            @dc={{@dc}}
            @allowServiceIdentity={{@allowServiceIdentity}}
          />
        </BlockSlot>
        <BlockSlot @name='actions' as |close|>
          <Hds::ButtonSet>
            <Hds::Button
              type='submit'
              @isLoading={{this.item.isSaving}}
              onclick={{perform this.save this.item @items (queue (action close) (action 'reset'))}}
              disabled={{if (or this.item.isSaving this.item.isPristine this.item.isInvalid) 'disabled'}}
              @text='Create and apply'
            />
            <Hds::Button
              type='reset'
              @color='secondary'
              disabled={{if this.item.isSaving 'disabled'}}
              {{on 'click' (action (queue (action close) (action 'reset')))}}
              @text='Cancel'
            />
          </Hds::ButtonSet>
        </BlockSlot>
      </ModalDialog>
    {{/yield-slot}}
  </BlockSlot>
  <BlockSlot @name='option' as |option|>
    {{option.Name}}
  </BlockSlot>
  <BlockSlot @name='set' as |remove|>
    <TabularDetails
      data-test-policies
      @onchange={{action 'open'}}
      @items={{sort-by 'CreateTime:desc' 'Name:asc' @items}}
      as |item index|
    >
      <BlockSlot @name='header'>
        <th>Name</th>
      </BlockSlot>
      <BlockSlot @name='row'>
        <td class={{policy/typeof item}}>
          {{#if item.ID}}
            <a href={{href-to 'dc.acls.policies.edit' item.ID}}>{{item.Name}}</a>
          {{else}}
            <a name={{item.Name}}>{{item.Name}}</a>
          {{/if}}
        </td>
      </BlockSlot>
      <BlockSlot @name='details'>
        {{#if (eq item.template '')}}
          <DataSource
            @src={{uri
              '/${partition}/${nspace}/${dc}/policy/${id}'
              (hash partition=@partition nspace=@nspace dc=@dc id=item.ID)
            }}
            @onchange={{action (mut this.loadedItem) value='data'}}
            @loading='lazy'
          />
        {{/if}}
        {{#if (eq item.template 'node-identity')}}
          <dl>
            <dt>Datacenter:</dt>
            <dd>
              {{item.Datacenter}}
            </dd>
          </dl>
        {{else}}
          <dl>
            <dt>Datacenters:</dt>
            <dd>
              {{join ', ' (policy/datacenters (or this.loadedItem item))}}
            </dd>
          </dl>
        {{/if}}
        <label class='type-text'>
          {{#if (eq item.template 'service-identity')}}
            <Hds::CodeBlock
              @language='hcl'
              @value={{service-identity-template
                item.Name
                partition=@partition
                nspace=@nspace
                canUsePartitions=(can 'use partitions')
                canUseNspaces=(can 'use nspaces')
              }}
              as |CB|
            >
              <CB.Title @tag='span'>
                Rules
                <a
                  href='{{env "CONSUL_DOCS_URL"}}/guides/acl.html#rule-specification'
                  rel='help noopener noreferrer'
                  target='_blank'
                  style="color: inherit;"
                >(HCL Format)</a>
              </CB.Title></Hds::CodeBlock>
          {{else if (eq item.template 'node-identity')}}
            <Hds::CodeBlock
              @language='hcl'
              @value={{node-identity-template
                item.Name
                partition=@partition
                canUsePartitions=(can 'use partitions')
                canUseNspaces=(can 'use nspaces')
              }}
              as |CB|
            >
              <CB.Title @tag='span'>
                Rules
                <a
                  href='{{env "CONSUL_DOCS_URL"}}/guides/acl.html#rule-specification'
                  rel='help noopener noreferrer'
                  target='_blank'
                  style="color: inherit;"
                >(HCL Format)</a>
              </CB.Title></Hds::CodeBlock>
          {{else}}
            <Hds::CodeBlock @language='hcl' @value={{or this.loadedItem.Rules this.item.Rules ''}} as |CB|>
              <CB.Title @tag='span'>
                Rules
                <a
                  href='{{env "CONSUL_DOCS_URL"}}/guides/acl.html#rule-specification'
                  rel='help noopener noreferrer'
                  target='_blank'
                  style="color: inherit;"
                >(HCL Format)</a>
              </CB.Title>
            </Hds::CodeBlock>
          {{/if}}
        </label>
        {{#if (not @disabled)}}
          <div>
            <ConfirmationDialog
              @message='Are you sure you want to remove this policy from this token?'
            >
              <BlockSlot @name='action' as |confirm|>
                <Hds::Button
                  @text='Remove'
                  @color='critical'
                  @size='small'
                  {{action confirm}}
                  data-test-delete
                />
              </BlockSlot>
              <BlockSlot @name='dialog' as |execute cancel message|>
                <p>
                  {{message}}
                </p>
                <Hds::ButtonSet>
                  <Hds::Button
                    @text='Confirm remove'
                    @color='critical'
                    @size='small'
                    {{action (queue execute (action remove item @items))}}
                    data-test-delete
                  />
                  <Hds::Button
                    @text='Cancel'
                    @color='secondary'
                    @size='small'
                    {{action cancel}}
                    data-test-delete
                  />
                </Hds::ButtonSet>
              </BlockSlot>
            </ConfirmationDialog>
          </div>
        {{/if}}
      </BlockSlot>
    </TabularDetails>

  </BlockSlot>
</ChildSelector>