/* eslint-env jasmine */

describe('Entity', function() {
    var center = Vec3.sum(
        MyAvatar.position,
        Vec3.multiply(3, Quat.getForward(Camera.getOrientation()))
    );
    var boxEntity;
    var boxProps = {
        type: 'Box',
        color: {
            red: 255,
            green: 255,
            blue: 255,
        },
        position: center,
        dimensions: {
            x: 1,
            y: 1,
            z: 1,
        },
    };

    it('serversExist', function() {
        expect(Entities.serversExist()).toBe(true);
    });

    it('canRezTmp', function() {
        expect(Entities.canRezTmp()).toBe(true);
    });

    beforeEach(function() {
        boxEntity = Entities.addEntity(boxProps);
    });

    afterEach(function() {
        Entities.deleteEntity(boxEntity);
        boxEntity = null;
    });

    it('can be added programmatically', function() {
        expect(typeof(boxEntity)).toEqual('string');
    });

    it('instantiates itself correctly', function() {
        var props = Entities.getEntityProperties(boxEntity);
        expect(props.type).toEqual(boxProps.type);
    });

    it('can be modified after creation', function() {
        var newPos = {
            x: boxProps.position.x,
            y: boxProps.position.y,
            z: boxProps.position.z + 1.0,
        };
        Entities.editEntity(boxEntity, {
            position: newPos,
        });

        var props = Entities.getEntityProperties(boxEntity);
        expect(Math.round(props.position.z)).toEqual(Math.round(newPos.z));
    });

    it("\'s last edited property working correctly", function() {
        var props = Entities.getEntityProperties(boxEntity);
        expect(props.lastEdited).toBeDefined();
        expect(props.lastEdited).not.toBe(0);
        var prevLastEdited = props.lastEdited;

        // Now we make an edit to the entity, which should update its last edited time
        Entities.editEntity(boxEntity, {color: {red: 0, green: 255, blue: 0}});
        props = Entities.getEntityProperties(boxEntity);
        expect(props.lastEdited).toBeGreaterThan(prevLastEdited);
    });

    it("filtering getEntityProperties seems to work correctly", function() {
        var properties = Entities.getEntityProperties(boxEntity, 'position');
        expect(properties.id).toBe(boxEntity);
        expect(properties.type).toBe(boxProps.type);
        expect(properties.position).toBeDefined();
    });

    it("filtering getMultipleEntityProperties seems to work correctly", function () {
        var sphereProps = {
            type: 'Sphere',
            color: {
                red: 255,
                green: 255,
                blue: 255,
            },
            position: center,
            dimensions: {
                x: 1,
                y: 1,
                z: 1,
            },
        };
        var sphereEntity = Entities.addEntity(sphereProps);

        var entityIDs = [boxEntity, sphereEntity];
        var filterTypes = 'type';
        var propertySets = Entities.getMultipleEntityProperties(entityIDs, filterTypes);
        expect(propertySets.length).toBe(entityIDs.length);
        expect(propertySets[0].type).toBe(boxProps.type);
        expect(Object.keys(propertySets[0]).length).toBe(1);
        expect(propertySets[1].type).toBe(sphereProps.type);
        expect(Object.keys(propertySets[1]).length).toBe(1);

        filterTypes = ['id', 'type'];
        propertySets = Entities.getMultipleEntityProperties(entityIDs, filterTypes);
        expect(propertySets.length).toBe(entityIDs.length);
        expect(Object.keys(propertySets[0]).length).toBe(filterTypes.length);
        expect(propertySets[0].id).toBe(boxEntity);
        expect(propertySets[0].type).toBe(boxProps.type);
        expect(Object.keys(propertySets[1]).length).toBe(filterTypes.length);
        expect(propertySets[1].id).toBe(sphereEntity);
        expect(propertySets[1].type).toBe(sphereProps.type);

        Entities.deleteEntity(sphereEntity);
    });

});