
import {
    Component, EventEmitter,
    OnDestroy,
    OnInit, Output,
} from '@angular/core';
import {
    DetailsPanelBaseImpl,
    FnService,
    LionService,
    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 wss: WebSocketService,
        private lion: LionService
    ) {
        super(fs, 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 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']]);
    }
}
