<!--
  ~ 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="detail-dialog" id="dialog-box">
  <header class="dialog-header header-white">
    <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
  </header>
  <div class="dialog-content">
    <div *ngIf="resource">
      <table class="detail-header">
        <tr>
          <td class="tooltip-wrap" (mouseover)="isEllipsisActive($event)">
            <div class="hint-title ellipsis">{{resource.computational_name}}</div>
            <div class="tooltip" [style.visibility]="tooltip ? 'visible': 'hidden'">{{resource.computational_name}}
            </div>
          </td>
          <td>
            <span class="status" [ngClass]="resource.status || ''">
              {{resource.status}}
            </span>
          </td>
          <td>{{ resource[DICTIONARY[PROVIDER][resource.image].master_node_shape] }}</td>
        </tr>
      </table>
      <div class="detail-info content-box" *ngIf="!resource.error_message">
        <div class="row-wrap">
          <div class="col">
            <p>Cluster type:</p>
          </div>
          <div class="col"><span>{{ resource.template_name }}</span></div>
        </div>
        <div class="row-wrap" *ngIf="resource.image === 'docker.datalab-dataengine-service'">
          <div class="col">
              <p>Cluster version:</p>
          </div>
          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER].cluster_version] }}</span></div>
        </div>
        <div class="row-wrap">
          <div class="col">
            <p>Cluster alias:</p>
          </div>
          <div class="col" (mouseover)="isEllipsisActive($event)">
            <span>{{resource.computational_name}}</span>
            <!-- <div class="tooltip" [style.visibility]="tooltip ? 'visible': 'hidden'">{{resource.computational_name}}</div> -->
          </div>
        </div>
        <div class="row-wrap">
          <div class="col"
              *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp'; else inst">
            <p>Master instance number:</p>
          </div>
          <ng-template #inst>
            <div class="col">
              <p>Total instance number:</p>
            </div>
          </ng-template>
          <div class="col">
            <span *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'aws'">{{ resource.totalInstanceCount > 0 ? resource.totalInstanceCount : resource.dataengine_instance_count}}</span>
            <span *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'azure'">{{resource.dataengine_instance_count}}</span>
            <span *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp'">1</span>
          </div>
        </div>
        <div class="row-wrap"
          *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp'">
          <div class="col">
            <p>Slave instance number:</p>
          </div>
          <div class="col"><span>{{ resource.totalInstanceCount - 1}}</span></div>
        </div>
        <div class="row-wrap">
          <div class="col">
            <p>Master instance size:</p>
          </div>
          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].master_node_shape] }}</span></div>
        </div>
        <div class="row-wrap">
          <div class="col">
            <p>Slave instance size:</p>
          </div>
          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].slave_node_shape] }}</span></div>
        </div>
        <ng-template [ngIf]="resource?.enabledGPU">
          <div class="row-wrap">
            <div class="col">
              <p>Master GPU type:</p>
            </div>
            <div class="col"><span>{{resource.master_gpu_type}}</span></div>
          </div>
          <div class="row-wrap">
            <div class="col">
              <p>Slave GPU type:</p>
            </div>
            <div class="col"><span>{{resource.slave_gpu_type}}</span></div>
          </div>
          <div class="row-wrap">
            <div class="col">
              <p>Master GPU count:</p>
            </div>
            <div class="col"><span>{{resource.master_gpu_count}}</span></div>
          </div>
          <div class="row-wrap">
            <div class="col">
              <p>Slave GPU count:</p>
            </div>
            <div class="col"><span>{{resource.slave_gpu_count}}</span></div>
          </div>
        </ng-template>
        <div *ngIf="resource.status === 'running'">
          <div class="row-wrap">
            <p class="time_info">Up time {{upTimeInHours}} hour(s) since {{resource.up_time ? (resource.up_time | longDate) : "not specified."
              }}
            </p>
          </div>
          <div class="m-top-10">
            <p *ngFor="let item of resource.computational_url" class="ellipsis flex" (mouseleave)="hideCopyIcon()">
              <span class="strong spark-url-desc">{{ item.description }}:</span>&nbsp;
              <a (click)="logAction(resource, environment, 'follow')"
                 href="{{item.url}}"
                 target="_blank"
                 matTooltip="{{item.url}}"
                 matTooltipPosition="above"
                 (mouseover)="showCopyIcon(item.description)"
                 class="spark-url ellipsis"
                 (contextmenu)="false"
              >{{ item.url }}</a>
              <span
                (click)="logAction(resource, environment, 'copy');$event.stopPropagation()"
                *ngIf="isCopyIconVissible[item.description]"
                [matTooltip]="isCopied ? 'Copy ' + item.description + (item.description.indexOf('url')  === -1 ? ' url' : ''): 'Copied'" matTooltipPosition="above" class="copy-icon-wrapper"
              >
                <span  class="link-icon" (click)="copyLink(item.url)" >
                  <span _ngcontent-xpv-c19="" class="material-icons" (click)="this.isCopied = false">content_copy</span>
                 </span>
              </span>
            </p>
          </div>
        </div>
          <div class="checkbox-group" 
            *ngIf="resource.image === 'docker.datalab-dataengine'
                && resource.status === 'running'
                && environment.image !== 'docker.datalab-zeppelin'
                && environment.image !== 'docker.datalab-superset'
                && environment.image !== 'docker.datalab-jupyterlab'"
          >
            <label>
              <input #configurationNode type="checkbox" (change)="selectConfiguration()"/> Cluster configurations
            </label>
            <div class="checkbox-group">
              <form [formGroup]="configurationForm" novalidate>
                <div class="config-details"
                    [ngClass]="{ show: configuration?.nativeElement['checked'] || false }">
                  <textarea 
                    formControlName="configuration_parameters" 
                    placeholder="Cluster configuration template, JSON"
                    data-gramm_editor="false">
                  </textarea>
                  <span class="danger_color"
                    *ngIf="!configurationForm.controls.configuration_parameters.valid 
                        && configurationForm.controls['configuration_parameters'].dirty">
                        Configuration parameters is not in a valid format
                  </span>
                </div>
              </form>
            </div>
          </div>
          <div *ngIf="environment.image === 'docker.datalab-zeppelin' && resource.status === 'running'">
            <small>Spark default configuration for Apache Zeppelin can not be changed from DataLab UI. 
              Currently it can be done directly through Apache Zeppelin interpreter menu.
                For more details please refer for Apache Zeppelin 
                <a href="https://zeppelin.apache.org/docs/0.9.0/usage/interpreter/overview.html" target="_blank">official
                    documentation</a>.
            </small>
          </div>
          <div class="text-center m-top-30" *ngIf="configuration?.nativeElement['checked'] || false">
            <button mat-raised-button type="button" 
                    (click)="dialogRef.close()" 
                    class="butt action">Cancel
            </button>
            <button mat-raised-button type="submit" 
                    [disabled]="!configurationForm.valid"
                    class="butt butt-success action"
                    [ngClass]="{'not-allowed': !configurationForm.valid}"
                    (click)="editClusterConfiguration(configurationForm.value)">Update
            </button>
        </div>
      </div>

      <div class="row-wrap detail-info content-box" *ngIf="resource.error_message">
        <p class="failed">{{resource.error_message}}</p>
      </div>
    </div>
  </div>
</div>
