require('../../support/test_helper');

var assert = require('../../support/assert');
var testClient = require('./support/test_client');

var PortedServerOptions = require('./support/ported_server_options');
var BaseController = require('../../../lib/cartodb/controllers/base');

describe('wrap x coordinate', function() {

    var req2paramsFn;
    before(function() {
        req2paramsFn = BaseController.prototype.req2params;
        BaseController.prototype.req2params = PortedServerOptions.req2params;
    });

    after(function() {
        BaseController.prototype.req2params = req2paramsFn;
    });

    describe('renders correct tile', function() {
        var IMG_TOLERANCE_PER_MIL = 20;

        function plainTorqueMapConfig(plainColor) {
            return {
                version: '1.2.0',
                layers: [
                    {
                        type: 'plain',
                        options: {
                            color: plainColor
                        }
                    },
                    {
                        type: 'torque',
                        options: {
                            sql: "SELECT * FROM populated_places_simple_reduced " +
                                "where the_geom && ST_MakeEnvelope(-90, 0, 90, 65)",
                            cartocss: [
                                'Map {',
                                '    buffer-size:0;',
                                '    -torque-frame-count:1;',
                                '    -torque-animation-duration:30;',
                                '    -torque-time-attribute:"cartodb_id";',
                                '    -torque-aggregation-function:"count(cartodb_id)";',
                                '    -torque-resolution:1;',
                                '    -torque-data-aggregation:linear;',
                                '}',
                                '#populated_places_simple_reduced{',
                                '    comp-op: multiply;',
                                '    marker-fill-opacity: 1;',
                                '    marker-line-color: #FFF;',
                                '    marker-line-width: 0;',
                                '    marker-line-opacity: 1;',
                                '    marker-type: rectangle;',
                                '    marker-width: 3;',
                                '    marker-fill: #FFCC00;',
                                '}'
                            ].join(' '),
                            cartocss_version: '2.3.0'
                        }
                    }
                ]
            };
        }

        var testScenarios = [
            {
                tile: {
                    z: 2,
                    x: -2,
                    y: 1,
                    layer: 'all',
                    format: 'png'
                },
                fixture: {
                    z: 2,
                    x: 2,
                    y: 1
                },
                plainColor: 'white'
            },
            {
                tile: {
                    z: 2,
                    x: -3,
                    y: 1,
                    layer: 'all',
                    format: 'png'
                },
                fixture: {
                    z: 2,
                    x: 1,
                    y: 1
                },
                plainColor: '#339900'
            }
        ];

        function blendPngFixture(zxy) {
            return './test/fixtures/blend/blend-plain-torque-' + zxy.join('.') + '.png';
        }

        testScenarios.forEach(function(testScenario) {
            var tileRequest = testScenario.tile;
            var zxy = [tileRequest.z, tileRequest.x, tileRequest.y];
            var fixtureZxy = [testScenario.fixture.z, testScenario.fixture.x, testScenario.fixture.y];
            it('tile all/' + zxy.join('/') + '.png', function (done) {
                testClient.getTileLayer(plainTorqueMapConfig(testScenario.plainColor), tileRequest, function(err, res) {
                    assert.imageBufferIsSimilarToFile(res.body, blendPngFixture(fixtureZxy), IMG_TOLERANCE_PER_MIL,
                        function(err) {
                            assert.ok(!err);
                            done();
                        }
                    );
                });
            });
        });
    });

    describe('mapnik', function() {
        it("can get a tile with negative x coordinate",  function(done){
            testClient.getTile(testClient.defaultTableMapConfig('test_table'), 2, -2, 1, function(err, res, img) {
                assert.ok(!err);
                assert.ok(img);
                assert.equal(img.width(), 256);
                assert.equal(img.height(), 256);
                done();
            });
        });
    });

});
