<page-header
  ng-if="ctrl.state.viewReady"
  title="'Create Secret'"
  breadcrumbs="[{ label:'ConfigMaps and Secrets', link:'kubernetes.configurations', linkParams:{ tab: 'secrets' } }, 'Create a Secret']"
  reload="true"
></page-header>

<kubernetes-view-loading view-ready="ctrl.state.viewReady"></kubernetes-view-loading>

<div ng-if="ctrl.state.viewReady">
  <div class="row">
    <div class="col-xs-12">
      <rd-widget>
        <rd-widget-body>
          <form class="form-horizontal" name="kubernetesConfigurationCreationForm" autocomplete="off">
            <!-- resource-pool -->
            <div class="form-group" ng-if="ctrl.formValues.ResourcePool">
              <label for="resource-pool-selector" class="col-sm-3 col-lg-2 control-label text-left">Namespace</label>
              <div class="col-sm-8 col-lg-9">
                <select
                  class="form-control"
                  id="resource-pool-selector"
                  ng-model="ctrl.formValues.ResourcePool"
                  ng-options="resourcePool.Namespace.Name for resourcePool in ctrl.resourcePools"
                  ng-change="ctrl.onResourcePoolSelectionChange()"
                  data-cy="k8sConfigCreate-namespaceDropdown"
                ></select>
              </div>
            </div>
            <div class="form-group" ng-if="ctrl.state.resourcePoolHasQuota && ctrl.resourceQuotaCapacityExceeded() && ctrl.formValues.ResourcePool">
              <div class="col-sm-12 small text-warning vertical-center">
                <pr-icon icon="'alert-triangle'" mode="'warning'"></pr-icon>
                This namespace has exhausted its resource capacity and you will not be able to deploy the configuration. Contact your administrator to expand the capacity of the
                namespace.
              </div>
            </div>
            <div class="form-group" ng-if="!ctrl.formValues.ResourcePool">
              <div class="col-sm-12 small text-warning vertical-center">
                <pr-icon icon="'alert-triangle'" mode="'warning'"></pr-icon>
                You do not have access to any namespace. Contact your administrator to get access to a namespace.
              </div>
            </div>
            <!-- !resource-pool -->

            <!-- name -->
            <div class="form-group">
              <label for="configuration_name" class="col-sm-3 col-lg-2 control-label required text-left">Name</label>
              <div class="col-sm-8 col-lg-9 mb-0">
                <input
                  type="text"
                  data-cy="k8sConfigCreate-nameInput"
                  class="form-control"
                  id="configuration_name"
                  name="configuration_name"
                  ng-model="ctrl.formValues.Name"
                  ng-pattern="/^[a-z0-9]([a-z0-9-.]{0,61}[a-z0-9])?$/"
                  ng-change="ctrl.onChangeName()"
                  placeholder="my-secret"
                  auto-focus
                  required
                />
                <div ng-show="kubernetesConfigurationCreationForm.configuration_name.$invalid || ctrl.state.alreadyExist">
                  <div class="help-block small text-warning">
                    <div ng-messages="kubernetesConfigurationCreationForm.configuration_name.$error">
                      <p ng-message="required" class="vertical-center"><pr-icon icon="'alert-triangle'" mode="'warning'"></pr-icon> This field is required.</p>
                      <p ng-message="pattern" class="vertical-center"
                        ><pr-icon icon="'alert-triangle'" mode="'warning'" class="vertical-center"></pr-icon> This field must consist of lower case alphanumeric characters, '-' or
                        '.', and contain at most 63 characters, and must start and end with an alphanumeric character.</p
                      >
                    </div>
                    <p ng-if="ctrl.state.alreadyExist" class="vertical-center"
                      ><pr-icon icon="'alert-triangle'" mode="'warning'"></pr-icon> A configuration with the same name already exists inside the selected namespace.</p
                    >
                  </div>
                </div>
              </div>
            </div>
            <!-- !name -->

            <div class="col-sm-12 !p-0">
              <annotations-be-teaser></annotations-be-teaser>
            </div>

            <div ng-if="ctrl.formValues.ResourcePool">
              <div class="col-sm-12 form-section-title"> Information </div>
              <div class="form-group">
                <div class="col-sm-12 small text-muted vertical-center">
                  <pr-icon icon="'info'" mode="'primary'"></pr-icon>
                  <span>
                    More information about types of secret can be found in the official
                    <a class="hyperlink" href="https://kubernetes.io/docs/concepts/configuration/secret/#secret-types" target="_blank">Kubernetes documentation</a>.
                  </span>
                </div>
              </div>

              <div class="form-group">
                <label for="configuration_data_type" class="col-sm-3 col-lg-2 control-label text-left">Type</label>
                <div class="col-sm-8 col-lg-9">
                  <select
                    class="form-control"
                    id="configuration_data_type"
                    ng-model="ctrl.formValues.Type"
                    ng-options="value.value as value.name for (name, value) in ctrl.KubernetesSecretTypeOptions"
                    ng-change="ctrl.onSecretTypeChange()"
                    data-cy="k8sConfigCreate-typeDropdown"
                  ></select>

                  <div class="col-sm-3 col-lg-2"></div>
                </div>
                <div ng-if="ctrl.formValues.Type === ctrl.KubernetesSecretTypeOptions.SERVICEACCOUNTTOKEN.value" class="col-sm-12 small text-warning vertical-center pt-5">
                  <pr-icon icon="'alert-triangle'" mode="'warning'"></pr-icon>
                  <span
                    >You should only create a service account token Secret object if you can't use the TokenRequest API to obtain a token, and the security exposure of persisting a
                    non-expiring token credential in a readable API object is acceptable to you. <br />See
                    <a href="https://kubernetes.io/docs/concepts/configuration/secret/#service-account-token-secrets" target="_blank">service account token secrets</a> in the
                    kubernetes documentation.</span
                  >
                </div>
                <div ng-if="ctrl.formValues.Type === ctrl.KubernetesSecretTypeOptions.DOCKERCFG.value" class="col-sm-12 small text-muted vertical-center pt-5">
                  <pr-icon icon="'info'" mode="'primary'"></pr-icon>
                  <span>Ensure the Secret data field contains a <code>.dockercfg</code> key whose value is content of a legacy <code>~/.dockercfg</code> file.</span>
                </div>
                <div ng-if="ctrl.formValues.Type === ctrl.KubernetesSecretTypeOptions.DOCKERCONFIGJSON.value" class="col-sm-12 small text-muted vertical-center pt-5">
                  <pr-icon icon="'info'" mode="'primary'"></pr-icon>
                  <span>Ensure the Secret data field contains a <code>.dockerconfigjson</code> key whose value is content of a <code>~/.docker/config.json</code> file.</span>
                </div>
                <div ng-if="ctrl.formValues.Type === ctrl.KubernetesSecretTypeOptions.TLS.value" class="col-sm-12 small text-muted vertical-center pt-5">
                  <pr-icon icon="'info'" mode="'primary'"></pr-icon>
                  <span>Ensure the Secret data field contains a <code>tls.key</code> key and a <code>tls.crt</code> key.</span>
                </div>
                <div ng-if="ctrl.formValues.Type === ctrl.KubernetesSecretTypeOptions.BOOTSTRAPTOKEN.value" class="col-sm-12 small text-muted vertical-center pt-5">
                  <pr-icon icon="'info'" mode="'primary'"></pr-icon>
                  <span
                    >Ensure the Secret data field contains a <code>token-id</code> key and a <code>token-secret</code> key. See
                    <a href="https://kubernetes.io/docs/concepts/configuration/secret/#bootstrap-token-secrets" target="_blank">bootstrap token secrets</a> in the kubernetes
                    documentation for optional keys.</span
                  >
                </div>
              </div>
              <div class="form-group" ng-if="ctrl.formValues.Type === ctrl.KubernetesSecretTypeOptions.CUSTOM.value">
                <label for="configuration_data_customtype" class="col-sm-3 col-lg-2 control-label required text-left">Custom Type</label>
                <div class="col-sm-8 col-lg-9">
                  <input
                    type="text"
                    data-cy="k8sConfigCreate-customType-input"
                    name="custom_type"
                    class="form-control"
                    id="configuration_data_customtype"
                    ng-model="ctrl.formValues.customType"
                    ng-pattern="/^[a-z0-9]([a-z0-9-.]{0,61}[a-z0-9])?$/"
                    required
                  />
                  <div ng-show="kubernetesConfigurationCreationForm.custom_type.$invalid">
                    <div class="help-block small text-warning">
                      <div ng-messages="kubernetesConfigurationCreationForm.custom_type.$error">
                        <p ng-message="required" class="vertical-center"><pr-icon icon="'alert-triangle'" mode="'warning'"></pr-icon> This field is required.</p>
                        <p ng-message="pattern" class="vertical-center"
                          ><pr-icon icon="'alert-triangle'" mode="'warning'" class="vertical-center"></pr-icon> This field must consist of lower case alphanumeric characters, '-'
                          or '.', and contain at most 63 characters, and must start and end with an alphanumeric character.</p
                        >
                      </div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="form-group" ng-if="ctrl.formValues.Type === ctrl.KubernetesSecretTypeOptions.SERVICEACCOUNTTOKEN.value">
                <label for="service_account" class="col-sm-3 col-lg-2 control-label required text-left">Service Account</label>
                <div class="col-sm-8 col-lg-9">
                  <select
                    class="form-control"
                    id="service_account"
                    ng-selected="$first"
                    ng-model="ctrl.formValues.ServiceAccountName"
                    ng-options="value.metadata.name as value.metadata.name for (name, value) in ctrl.availableServiceAccounts"
                    data-cy="k8sConfigCreate-serviceAccountDropdown"
                    ng-change="ctrl.onChangeServiceAccount()"
                    required
                  ></select>
                  <div class="help-block small text-warning" ng-messages="kubernetesConfigurationCreationForm.service_account.$error">
                    <p class="vertical-center" ng-message="required"> <pr-icon icon="'alert-triangle'" mode="'warning'"></pr-icon>This field is required.</p>
                  </div>
                </div>
              </div>

              <kubernetes-configuration-data
                ng-if="ctrl.formValues"
                form-values="ctrl.formValues"
                is-docker-config="ctrl.state.isDockerConfig"
                is-valid="ctrl.state.isDataValid"
                on-change-validation="ctrl.isFormValid()"
                is-creation="true"
                type="'secret'"
                is-editor-dirty="ctrl.state.isEditorDirty"
              ></kubernetes-configuration-data>

              <div class="form-group" ng-if="ctrl.state.secretWarningMessage">
                <div class="col-sm-12 small text-warning vertical-center pt-5">
                  <pr-icon icon="'alert-triangle'" mode="'warning'"></pr-icon>
                  <span>{{ ctrl.state.secretWarningMessage }}</span>
                </div>
              </div>
            </div>

            <!-- summary -->
            <kubernetes-summary-view
              ng-if="!(!kubernetesConfigurationCreationForm.$valid || !ctrl.isFormValid() || ctrl.state.actionInProgress)"
              form-values="ctrl.formValues"
            ></kubernetes-summary-view>

            <!-- actions -->
            <div class="col-sm-12 form-section-title" style="margin-top: 10px"> Actions </div>
            <div class="form-group">
              <div class="col-sm-12">
                <button
                  type="button"
                  class="btn btn-primary btn-sm !ml-0"
                  ng-disabled="!kubernetesConfigurationCreationForm.$valid || !ctrl.isFormValid() || ctrl.state.actionInProgress || !ctrl.formValues.ResourcePool"
                  ng-click="ctrl.createConfiguration()"
                  button-spinner="ctrl.state.actionInProgress"
                  data-cy="k8sConfigCreate-CreateConfigButton"
                >
                  <span ng-hide="ctrl.state.actionInProgress">Create {{ ctrl.formValues.Kind | kubernetesConfigurationKindText }}</span>
                  <span ng-show="ctrl.state.actionInProgress">Creation in progress...</span>
                </button>
              </div>
            </div>
            <!-- !actions -->
          </form>
        </rd-widget-body>
      </rd-widget>
    </div>
  </div>
</div>
