/**
 * Created by jd on 14/04/2016.
 */
export class ObjectId
{

    private timestamp = Math.floor(new Date().valueOf() / 1000);
    private increment = Math.floor(Math.random() * (16777216));
    private pid = Math.floor(Math.random() * (65536));
    private machine = Math.floor(Math.random() * (16777216));


    private setMachine = () =>
    {
        var mongoMachineId = parseInt(localStorage['mongoMachineId']);
        if (mongoMachineId >= 0 && mongoMachineId <= 16777215)
        {
            this.machine = Math.floor(localStorage['mongoMachineId']);
        }
        // Just always stick the value in.
        localStorage['mongoMachineId'] = this.machine;
    };

    constructor()
    {
        this.setMachine();

        if (typeof (arguments[0]) == 'object')
        {
            this.timestamp = arguments[0].timestamp;
            this.machine = arguments[0].machine;
            this.pid = arguments[0].pid;
            this.increment = arguments[0].increment;
        }
        else if (typeof (arguments[0]) == 'string' && arguments[0].length == 24)
        {
            this.timestamp = Number('0x' + arguments[0].substr(0, 8)),
                this.machine = Number('0x' + arguments[0].substr(8, 6)),
                this.pid = Number('0x' + arguments[0].substr(14, 4)),
                this.increment = Number('0x' + arguments[0].substr(18, 6))
        }
        else if (arguments.length == 4 && arguments[0] != null)
        {
            this.timestamp = arguments[0];
            this.machine = arguments[1];
            this.pid = arguments[2];
            this.increment = arguments[3];
        }
        else
        {
            this.timestamp = Math.floor(new Date().valueOf() / 1000);
            this.machine = this.machine;
            this.pid = this.pid;
            this.increment = this.increment++;
            if (this.increment > 0xffffff)
            {
                this.increment = 0;
            }
        }


    }

    public  getDate = () =>
    {
        return new Date(this.timestamp * 1000);
    };
    public  toArray = () =>
    {
        var strOid = this.toString();
        var array = [];
        var i;
        for (i = 0; i < 12; i++)
        {
            array[i] = parseInt(strOid.slice(i * 2, i * 2 + 2), 16);
        }
        return array;
    };


    public toString = ():string =>
    {
        if (this.timestamp === undefined
            || this.machine === undefined
            || this.pid === undefined
            || this.increment === undefined)
        {
            return 'Invalid ObjectId';
        }

        var timestamp = this.timestamp.toString(16);
        var machine = this.machine.toString(16);
        var pid = this.pid.toString(16);
        var increment = this.increment.toString(16);
        return '00000000'.substr(0, 8 - timestamp.length) + timestamp +
            '000000'.substr(0, 6 - machine.length) + machine +
            '0000'.substr(0, 4 - pid.length) + pid +
            '000000'.substr(0, 6 - increment.length) + increment;
    };


}