import { is } from '@pilotlab/lux-is';
import {Orientation} from './appEnums';


/*====================================================================*
 ===== START: DeviceType
 *====================================================================*/
export enum DeviceType {
    DESKTOP,
    MOBILE
} // End enum


/*====================================================================*
 ===== START: IAppContext
 *====================================================================*/
export interface IAppContext {
    deviceTarget:DeviceType;
    widthPreferred:number;
    heightPreferred:number;
    isConstrainMin:boolean;
    isConstrainMax:boolean;
} // End interface


/*====================================================================*
 ===== START: AppContextBase
 *====================================================================*/
export class AppContextBase implements IAppContext {
    constructor(deviceTarget:DeviceType, widthPreferred?:number, heightPreferred?:number, isConstrainMin?:boolean, isConstrainMax?:boolean) {
        this.p_deviceTarget = deviceTarget;
        if (is.notEmpty(widthPreferred)) this.p_widthPreferred = widthPreferred;
        if (is.notEmpty(heightPreferred)) this.p_heightPreferred = heightPreferred;
        if (is.notEmpty(isConstrainMin)) this.p_isConstrainMin = isConstrainMin;
        if (is.notEmpty(isConstrainMax)) this.p_isConstrainMax = isConstrainMax;
    }


    get deviceTarget():DeviceType { return this.p_deviceTarget; }
    protected p_deviceTarget:DeviceType;


    get widthPreferred():number { return this.p_widthPreferred; }
    protected p_widthPreferred:number;


    get heightPreferred():number { return this.p_heightPreferred; }
    protected p_heightPreferred:number;


    get isConstrainMin():boolean { return this.p_isConstrainMin; }
    protected p_isConstrainMin:boolean = false;


    get isConstrainMax():boolean { return this.p_isConstrainMax; }
    protected p_isConstrainMax:boolean = false;
} // End class


/*====================================================================*
 ===== START: AppContextMobile
 *====================================================================*/
export class AppContextMobile extends AppContextBase {
    constructor(
        orientationMode:Orientation = Orientation.BOTH,
        widthPreferred?:number,
        heightPreferred?:number,
        emulationContext?:AppContextDesktopEmulation
    ) {
        super(DeviceType.MOBILE, widthPreferred, heightPreferred);
        this.p_orientationMode = orientationMode;
        if (is.notEmpty(emulationContext)) this.p_emulationContext = emulationContext;
    }


    get orientationMode():Orientation { return this.p_orientationMode; }
    protected p_orientationMode:Orientation = Orientation.VERTICAL;


    get emulationContext():AppContextDesktopEmulation { return this.p_emulationContext; }
    protected p_emulationContext:AppContextDesktopEmulation;
} // End class


/*====================================================================*
 ===== START: AppContextWebEmbedded
 *====================================================================*/
export class AppContextWebEmbedded extends AppContextBase {
    constructor(widthPreferred?:number, heightPreferred?:number) {
        super(DeviceType.DESKTOP, widthPreferred, heightPreferred);
    }
} // End class


/*====================================================================*
 ===== START: AppContextDesktop
 *====================================================================*/
export class AppContextDesktop extends AppContextBase {
    constructor(widthPreferred?:number, heightPreferred?:number, isConstrainMin?:boolean, isConstrainMax?:boolean) {
        super(DeviceType.DESKTOP, widthPreferred, heightPreferred, isConstrainMin, isConstrainMax);
    }

    get mobileOrientationMode():Orientation { return this.p_mobileOrientationMode; }
    protected p_mobileOrientationMode:Orientation = Orientation.VERTICAL;
} // End class


/*====================================================================*
 ===== START: AppContextDesktopEmulation
 *====================================================================*/
export class AppContextDesktopEmulation extends AppContextDesktop {
    constructor(
        deviceShellImageSrc?:string,
        deviceShellOrientation:Orientation = Orientation.VERTICAL,
        widthPreferred:number = 750,
        heightPreferred:number = 1334
    ) {
        super();
        this.p_deviceShellImageSrc = deviceShellImageSrc;
        this.p_mobileOrientationMode = deviceShellOrientation;
        this.p_appWidthPreferred = widthPreferred;
        this.p_appHeightPreferred = heightPreferred;
    }


    get deviceShellImageSrc():string { return this.p_deviceShellImageSrc; }
    protected p_deviceShellImageSrc:string;


    get appWidthPreferred():number { return this.p_appWidthPreferred; }
    protected p_appWidthPreferred:number;


    get appHeightPreferred():number { return this.p_appHeightPreferred; }
    protected p_appHeightPreferred:number;
} // End class
