import { PeekCanvasConfig } from "./PeekCanvasConfig.web"
import { DispBase, DispBaseT } from "../canvas-shapes/DispBase"
import { Subject } from "rxjs"
import { Observable } from "rxjs"
import { PeekCanvasModel } from "./PeekCanvasModel.web"

// import 'rxjs/add/operator/takeUntil';

function now(): any {
    return new Date()
}

/**
 * Peek Canvas Model
 *
 * This class stores and manages the model of the NodeCoord and ConnCoord
 * objects that are within the viewable area.
 *
 */

export class PeekCanvasModelSelection {
    
    // The currently selected coords
    private _selection: DispBaseT[] = []
    
    private _selectionChangedSubject = new Subject<DispBaseT[]>()
    
    private _keysToTryToSelect: string[] = []
    
    constructor(
        private model,
        private config: PeekCanvasConfig
    ) {
    
    };

// -------------------------------------------------------------------------------------
// reset
// -------------------------------------------------------------------------------------
    reset() {
        this._selection = []
        this._keysToTryToSelect = []
    };
    
    selectionChangedObservable(): Observable<DispBaseT[]> {
        return this._selectionChangedSubject
    }
    
    selectedDisps(): DispBaseT[] {
        return this._selection
    }
    
    applyTryToSelect() {
        
        for (let key of this._keysToTryToSelect) {
            for (let disp of this.model.viewableDisps()) {
                if (DispBase.key(disp) == key) {
                    this._selection.add(disp) // Don't notify of item select
                    this._keysToTryToSelect.remove(key)
                    break
                }
            }
        }
        
    }
    
    tryToSelectKeys(keys: string[]) {
        this._keysToTryToSelect = keys
    }
    
    replaceSelection(objectOrArray: DispBaseT | DispBaseT[] = []) {
        this._selection = []
        this._selection = this._selection.add(objectOrArray)
        this._selectionChangedSubject.next(this._selection)
        this.config.invalidate()
    }
    
    addSelection(objectOrArray) {
        this._selection = this._selection.add(objectOrArray)
        this._selectionChangedSubject.next(this._selection)
        this.config.invalidate()
    }
    
    removeSelection(objectOrArray) {
        this._selection = this._selection.remove(objectOrArray)
        this._selectionChangedSubject.next(this._selection)
        this.config.invalidate()
    }
    
    clearSelection() {
        this.replaceSelection()
    }
    
}
