
import {
    Component, EventEmitter, OnChanges,
    OnDestroy,
    OnInit, Output, SimpleChanges,
} from '@angular/core';
import {
    DetailsPanelBaseImpl,
    FnService,
    LionService, LoadingService,
    LogService,
    WebSocketService
} from 'gui2-fw-lib';
import {FormControl, FormGroup} from '@angular/forms';
import { MapObject } from '../../layer/maputils';

interface MapSelection {
    order: string[];
    maps: Object[];
}

@Component({
    selector: 'onos-mapselector',
    templateUrl: './mapselector.component.html',
    styleUrls: ['./mapselector.component.css', './mapselector.theme.css', '../../topology.common.css']
})
export class MapSelectorComponent extends DetailsPanelBaseImpl implements OnInit, OnDestroy {
    @Output() chosenMap = new EventEmitter<MapObject>();
    lionFn; // Function
    mapSelectorResponse: MapSelection = <MapSelection>{
        order: [],
        maps: []
    };
    form = new FormGroup({
        mapid: new FormControl(this.mapSelectorResponse.order[0]),
    });

    constructor(
        protected fs: FnService,
        protected log: LogService,
        protected ls: LoadingService,
        protected wss: WebSocketService,
        private lion: LionService
    ) {
        super(fs, ls, log, wss, 'topo');

        if (this.lion.ubercache.length === 0) {
            this.lionFn = this.dummyLion;
            this.lion.loadCbs.set('topoms', () => this.doLion());
        } else {
            this.doLion();
        }

        this.log.debug('Topo MapSelectorComponent constructed');
    }

    ngOnInit() {
        this.wss.bindHandlers(new Map<string, (data) => void>([
            ['mapSelectorResponse', (data) => {
                this.mapSelectorResponse = data;
                this.form.setValue({'mapid': this.mapSelectorResponse.order[0]});
            }
            ]
        ]));
        this.wss.sendEvent('mapSelectorRequest', {});
        this.log.debug('Topo MapSelectorComponent initialized');
    }

    /**
     * When the component is being unloaded then unbind the WSS handler.
     */
    ngOnDestroy(): void {
        this.wss.unbindHandlers(['mapSelectorResponse']);
        this.log.debug('Topo MapSelectorComponent destroyed');
    }

    /**
     * Read the LION bundle for Details panel and set up the lionFn
     */
    doLion() {
        this.lionFn = this.lion.bundle('core.view.Topo');
    }

    choice(mapid: Object): void {
        this.chosenMap.emit(<MapObject>this.mapSelectorResponse.maps[mapid['mapid']]);
    }
}
