
import {
    Component, EventEmitter,
    OnDestroy,
    OnInit, Output,
} from '@angular/core';
import {
    DetailsPanelBaseImpl,
    FnService,
    LionService,
    LogService,
    WebSocketService
} from '../../../../gui2-fw-lib/public_api';
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 {
        if (mapid) {
            this.chosenMap.emit(<MapObject>this.mapSelectorResponse.maps[mapid['mapid']]);
        } else {
            this.chosenMap.emit(<MapObject>{});
        }
    }
}
