<!--
 Copyright 2019 Google LLC

 Licensed 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="header">
  <div class="back-button-label">Individual Tests</div>
  <h1 class="subtitle">
    <button mat-icon-button (click)="back()" #backButton id="back-button"
        matTooltip="Return to test suites page"
        aria-label="Return to test suites page">
      <mat-icon class="back-button-icon">arrow_back</mat-icon>
    </button>
    Schedule a Test Run
  </h1>
</div>

<!-- Stepper -->
<mat-horizontal-stepper linear="true" #stepper
  (selectionChange)="resetStepCompletion($event.selectedIndex, stepCompletionStatusMap, totalSteps)"
  >
  <ng-template matStepperIcon="edit">
    <mat-icon>check</mat-icon>
  </ng-template>
  <!-- First step: Configure Test Run -->
  <mat-step [completed]="!!stepCompletionStatusMap[step.CONFIGURE_TEST_RUN]">
    <ng-template matStepLabel>Configure Test Run</ng-template>
      <!-- Loading Spinner -->
      <mat-spinner
        class="loading-spinner" color="accent" *ngIf="isLoading">
      </mat-spinner>
      <test-run-config-form [class.loading-mask]="isLoading"
        [testMap]="mttObjectMap.testMap"
        [(testRunConfig)]="testRunConfig"
        [prevTestRunId]="prevTestRunId"
        (rerunContext)="rerunContext = $event"
        (testRunConfigChange)="updateTestResources()">
      </test-run-config-form>

      <!-- Labels Field -->
      <mat-form-field fxFlex="600px">
        <mat-chip-grid #chipList aria-label="Labels">
          <mat-chip-row
            *ngFor="let label of labels"
            (removed)="removeLabel(label)">
            {{ label }}
            <mat-icon matChipRemove>cancel</mat-icon>
          </mat-chip-row>
          <input
            placeholder="Labels"
            [matChipInputFor]="chipList"
            [matChipInputSeparatorKeyCodes]="separatorKeyCodes"
            [matChipInputAddOnBlur]="true"
            (matChipInputTokenEnd)="addLabel($event)"/>
        </mat-chip-grid>
      </mat-form-field>
    <div>
      <button mat-flat-button
      (click)="goForward(stepper)"
      color="accent">
        Next Step
      </button>
      <button mat-button (click)="back()" color="accent">Cancel</button>
      <!-- Error messages after validation -->
      <form-error-info [invalidInputs]="invalidInputs"></form-error-info>
      <form-error-info [errorMessage]="errorMessage"></form-error-info>
    </div>
  </mat-step>

  <!-- Second step: Select Devices -->
  <mat-step [completed]="!!stepCompletionStatusMap[step.SELECT_DEVICES]">
    <ng-template matStepLabel>Select Devices</ng-template>

    <test-run-target-picker [(deviceSpecs)]="testRunConfig.device_specs"
                            [(shardCount)]="testRunConfig.shard_count"
                            [autoUpdate]="true"
                            (deviceSpecsChange)="updateSelectedDeviceActions($event)"
                            [(allowPartialDeviceMatch)]="testRunConfig.allow_partial_device_match">
    </test-run-target-picker>

    <div>
      <button mat-stroked-button matStepperPrevious color="accent">
        Previous Step
      </button>
      <button mat-flat-button (click)="goForward(stepper)"
      color="accent">
        Next Step
      </button>
      <button mat-button (click)="back()" color="accent">Cancel</button>
      <form-error-info [errorMessage]="errorMessage">
      </form-error-info>
    </div>
  </mat-step>

  <!-- Third step: Add Actions -->
  <mat-step [completed]="!!stepCompletionStatusMap[step.ADD_ACTIONS]">
    <ng-template matStepLabel>Add Actions</ng-template>
    <mat-spinner
      class="loading-spinner" color="accent" *ngIf="isLoading">
    </mat-spinner>
    <h2>Device Actions</h2>
    <device-action-picker [class.loading-mask]="isLoading"
      [deviceActions]="mttObjectMap.deviceActionMap | values"
      [selectedDeviceActions]="selectedDeviceActions"
      (selectionChange)="updateConfigDeviceActionIds()"
    >
    </device-action-picker>

    <h2>Test Run Actions</h2>
    <test-run-action-picker [class.loading-mask]="isLoading"
                            [actions]="mttObjectMap.testRunActionMap | values"
                            [selectedActions]="selectedTestRunActions"
                            (selectionChange)="updateConfigTestRunActionIds()">
    </test-run-action-picker>

    <mat-divider></mat-divider>

    <div>
      <button mat-stroked-button matStepperPrevious color="accent">
        Previous Step
      </button>
      <button mat-flat-button (click)="goForward(stepper)" color="accent">
        Next Step
      </button>
      <button mat-button (click)="back()" color="accent">Cancel</button>
    </div>
  </mat-step>

  <!-- Fourth step: Set Test Resources -->
  <mat-step [completed]="!!stepCompletionStatusMap[step.SET_TEST_RESOURCES]">
    <ng-template matStepLabel>Set Test Resources</ng-template>
    <mat-spinner
      class="loading-spinner" color="accent"
                 *ngIf="isLoading || isStartingTestRun">
    </mat-spinner>
    <test-resource-form
      [class.loading-mask]="isLoading"
      [data]="testRunConfig.test_resource_objs"
      [canAdd]="false"
      [canDelete]="false"
      [buildChannels]="mttObjectMap.buildChannelMap | values"
      testResourceClassType="TestResourceClassType.TEST_RESOURCE_OBJ"
    >
    </test-resource-form>
    <div>
      <button mat-stroked-button matStepperPrevious color="accent">
        Previous Step
      </button>
      <button mat-flat-button (click)="goForward(stepper)" color="accent">
        Next Step
      </button>
      <button mat-button (click)="back()" color="accent">Cancel</button>
    </div>
  </mat-step>

  <!-- Fifth step: Add Rerun Configs -->
  <mat-step [completed]="!!stepCompletionStatusMap[step.ADD_RERUN_CONFIGS]">
    <ng-template matStepLabel>Add Rerun Configs</ng-template>
    <mat-spinner class="loading-spinner" color="accent" *ngIf="isLoading || isStartingTestRun">
    </mat-spinner>

    <test-run-config-summary [config]="testRunConfig" [editable]="false"
                             [title]="'Primary Test Run Config'">
    </test-run-config-summary>

    <h3>
      Add rerun configurations
    </h3>
    <div class="description">
      Add configurations here to schedule reruns after the primary run using different devices,
      actions, or test resources.
    </div>
    <test-run-config-list [(data)]="rerunConfigs" [configTitle]="'Rerun Config'"
                          [configTemplate]="testRunConfig">
    </test-run-config-list>

    <div>
      <button mat-stroked-button matStepperPrevious color="accent">Previous Step</button>
      <button
        [disabled]="isStartingTestRun"
        mat-flat-button
        color="accent"
        id="start-test-run-button"
        (click)="startTestRun(!!warningMessage.length)"
      >
        Start Test Run <ng-container *ngIf="warningMessage.length">(Ignore Warnings)</ng-container>
      </button>
      <button mat-button (click)="back()" color="accent">Cancel</button>
      <form-error-info
        [warningMessage]="warningMessage"
        [invalidInputs]="invalidInputs"
      ></form-error-info>
    </div>
  </mat-step>
</mat-horizontal-stepper>
