/*
 * 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.
 */
import {Component, OnInit} from '@angular/core';
import {Topology} from './topology';
import {TopologyService} from './topology.service';


@Component({
    selector: 'app-topology',
    template: `
        <div class="table-responsive" style="max-height: 400px; width:100%; overflow: auto;">
            <table class="table table-striped table-hover">
                <thead>
                <tr>
                    <th>Topology Name</th>
                    <th>Timestamp</th>
                </tr>
                </thead>
                <tbody>
                <tr *ngFor="let topology of topologies"
                    [class.selected]="topology === selectedTopology"
                    (click)="onSelect(topology)">
                    <td>{{topology.name}}</td>
                    <td>{{topology.timestamp | date:'medium'}}</td>
                </tr>
                </tbody>
            </table>
        </div>
    `
})
export class TopologyComponent implements OnInit {

    value: any;
    topologies: Topology[];
    selectedTopology: Topology;


    constructor(private topologyService: TopologyService) {
    }

    getTopologies(): void {
        this.topologyService.getTopologies().then(topologies => this.topologies = topologies);
    }

    ngOnInit(): void {
        this.getTopologies();
        this.topologyService.changedTopology$.subscribe(value => this.getTopologies());
    }

    onSelect(topology: Topology): void {
        this.selectedTopology = topology;
        this.topologyService.selectedTopology(topology);
    }
}

