<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements.  See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership.  The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License.  You may obtain a copy of the License at
  ~
  ~   http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied.  See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->

<div class="manage-roles base-retreat">
  <div class="sub-nav">
    <div matTooltip="Only admin can add group."
         matTooltipPosition="above"
         [matTooltipDisabled]="healthStatus?.admin"
    >
      <button mat-raised-button class="butt add-group" (click)="stepperView = !stepperView" [disabled]="!healthStatus?.admin"
              >
        <i class="material-icons">people_outline</i>Add group
      </button>
    </div>
    <div></div>
  </div>

  <mat-card *ngIf="stepperView" class="m-top-10">
    <mat-horizontal-stepper #stepper class="stepper ani">
      <mat-step [completed]='false'>
        <ng-template matStepLabel>Groups</ng-template>
        <div class="inner-step mat-reset">
          <input [validator]="groupValidation()" type="text" placeholder="Enter group name" [(ngModel)]="setupGroup"
            #setupGroupName="ngModel">
          <div class="error" *ngIf="setupGroupName.errors?.patterns && setupGroupName.dirty">Group name can only
            contain letters, numbers, hyphens and '_'</div>
          <div class="error" *ngIf="setupGroupName.errors?.duplicate && setupGroupName.dirty">Group name already
            exists</div>
        </div>
        <div class="text-center m-bott-10">
          <button mat-raised-button (click)="resetDialog()" class="butt">Cancel</button>
          <button mat-raised-button matStepperNext class="butt">Next<i
              class="material-icons">keyboard_arrow_right</i></button>
        </div>
      </mat-step>

      <mat-step [completed]='false'>
        <ng-template matStepLabel>Users</ng-template>
        <div class="inner-step mat-reset">
          <input type="text" placeholder="Enter user login" [(ngModel)]="setupUser">
        </div>
        <div class="text-center m-bott-10">
          <button mat-raised-button matStepperPrevious class="butt"><i
              class="material-icons">keyboard_arrow_left</i>Back</button>
          <button mat-raised-button (click)="resetDialog()" class="butt">Cancel</button>
          <button mat-raised-button matStepperNext class="butt">Next<i
              class="material-icons">keyboard_arrow_right</i></button>
        </div>
      </mat-step>

      <mat-step [completed]='false'>
        <ng-template matStepLabel>Roles</ng-template>
        <div class="inner-step mat-reset roles">
          <div class="selector-wrapper">
            <multi-level-select-dropdown
              (selectionChange)="onUpdate($event)"
              name="roles"
              [items]="rolesList"
              [model]="setupRoles"
              [isAdmin]="healthStatus?.admin"
            >
            </multi-level-select-dropdown>
          </div>
        </div>
        <div class="text-center m-bott-10">
          <button mat-raised-button matStepperPrevious class="butt"><i
              class="material-icons">keyboard_arrow_left</i>Back</button>
          <button mat-raised-button (click)="resetDialog()" class="butt">Cancel</button>
          <button mat-raised-button (click)="manageAction('create', 'group')" class="butt butt-success"
            [disabled]="!setupGroup || setupGroupName.errors?.patterns || setupGroupName.errors?.duplicate || !setupRoles.length">Create</button>
        </div>
      </mat-step>

    </mat-horizontal-stepper>
  </mat-card>
  <mat-divider></mat-divider>

  <div *ngIf="groupsData.length" class="ani">
    <table mat-table [dataSource]="groupsData" class="projects-table mat-elevation-z6">
      <ng-container matColumnDef="name">
        <th mat-header-cell *matHeaderCellDef class="name"> Group name </th>
        <td mat-cell *matCellDef="let element"> {{element.group}} </td>
      </ng-container>

      <ng-container matColumnDef="roles">
        <th mat-header-cell *matHeaderCellDef class="roles"> Roles </th>
        <td mat-cell *matCellDef="let element" class="roles">
          <div class="inner-step mat-reset">
              <multi-level-select-dropdown
                (selectionChange)="onUpdate($event)"
                [type]="element.group"
                [items]="rolesList"
                [model]="element.selected_roles"
                [isAdmin]="healthStatus?.admin"
              >
              </multi-level-select-dropdown>
          </div>
        </td>
      </ng-container>

      <ng-container matColumnDef="users">
        <th mat-header-cell *matHeaderCellDef class="users"> Users </th>
        <td mat-cell *matCellDef="let element" class="users-list ani">
          <mat-form-field class="chip-list">
            <input #user matInput placeholder="Enter user login" pattern="[@.-_0-9a-zA-Z]"
              (keydown.enter)="addUser(user.value, element); user.value = ''">
            <button mat-icon-button matSuffix (click)="addUser(user.value, element); user.value = ''">
              <mat-icon>person_add</mat-icon>
            </button>
          </mat-form-field>
          <div class="list-selected list-container ani">
            <mat-chip-list>
              <mat-chip *ngFor="let user of element.users">
                {{ user }}
                <a class="material-icons" (click)="removeUser(element.users, user)">clear</a>
              </mat-chip>
            </mat-chip-list>
          </div>
        </td>
      </ng-container>

      <ng-container matColumnDef="actions">
        <th mat-header-cell *matHeaderCellDef class="actions"></th>
        <td mat-cell *matCellDef="let element" class="actions">
          <div class="actions-wrapper">
            <span class="action-disabled"
              matTooltip="Only admin can delete group."
              matTooltipPosition="above"
              [matTooltipDisabled]="healthStatus?.admin"
            >
              <span
                (click)="manageAction('delete', 'group', element)"
                class="reset ani"
                [ngClass]="{ 'not-allowed' : !healthStatus?.admin}"

              >
              <mat-icon >delete_forever</mat-icon>
            </span>
            </span>

            <span class="apply ani big-icon" matTooltip="Group cannot be updated without any selected role"
              matTooltipPosition="above" [matTooltipDisabled]="element.selected_roles.length > 0"
              [ngClass]="{ 'not-allowed' : !element.selected_roles.length || isGroupChanded(element)}"
              (click)="manageAction('update', 'group', element)">
              <mat-icon [ngClass]="{'big-icon': !isGroupChanded(element) && element.selected_roles.length}">done</mat-icon>
            </span>
          </div>
        </td>
      </ng-container>

      <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
      <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
    </table>

  </div>
</div>
