import is from '@pilotlab/is';
import { Initializable } from '@pilotlab/initializable';
import { Signal } from '@pilotlab/signals';


export abstract class ActivatableBase<TActivationTarget>
extends Initializable {
    constructor(data?:any) {
        super();
        if (is.notEmpty(data)) this.p_initializationData = data;
    }


    /*====================================================================*
     START: Properties
     *====================================================================*/
    get name():string { return 'default'; }


    get isActivated():boolean { return this.p_isActivated; }
    protected p_isActivated:boolean = false;


    get activationTarget():TActivationTarget { return this.p_activationTarget; }
    protected p_activationTarget:TActivationTarget;


    protected p_initializationData:any;


    /*====================================================================*
     START: Signals
     *====================================================================*/
    activated:Signal<any> = new Signal<any>();


    /*====================================================================*
     START: Methods
     *====================================================================*/
    activate(target:TActivationTarget, ...args:any[]):void {
        if (is.empty(target)) return;
        this.p_activationTarget = target;

        this.p_onActivationStarted(this.p_initializationData, ...args);
        this.p_onActivated(this.p_initializationData, ...args);
        this.activated.dispatch(this.p_initializationData);

        this.p_isActivated = true;
    }


    deactivate(...args:any[]):void {
        this.p_onDeactivated(...args);
        this.p_isActivated = false;
    }


    protected p_onActivationStarted(data:any, ...args:any[]):void {}
    protected p_onActivated(data:any, ...args:any[]):void {}
    protected p_onDeactivated(...args:any[]):void {}
} // End class


export default ActivatableBase;
