package mil.nga.geopackage.test.tiles.features;

import android.graphics.Bitmap;

import org.junit.Test;

import java.sql.SQLException;

import mil.nga.geopackage.db.FeatureIndexer;
import mil.nga.geopackage.features.index.FeatureIndexManager;
import mil.nga.geopackage.features.index.FeatureIndexType;
import mil.nga.geopackage.features.user.FeatureDao;
import mil.nga.geopackage.test.CreateGeoPackageTestCase;
import mil.nga.geopackage.tiles.TileBoundingBoxUtils;
import mil.nga.geopackage.tiles.features.FeatureTiles;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

/**
 * Test GeoPackage Feature Tiles, tiles created from features
 *
 * @author osbornb
 */
public class FeatureTilesTest extends CreateGeoPackageTestCase {

    /**
     * Constructor
     */
    public FeatureTilesTest() {

    }

    /**
     * Test feature tiles
     *
     * @throws java.sql.SQLException
     */
    @Test
    public void testFeatureTiles() throws SQLException {
        testFeatureTiles(false);
    }

    /**
     * Test feature tiles
     *
     * @throws java.sql.SQLException
     */
    @Test
    public void testFeatureTilesWithIcon() throws SQLException {
        testFeatureTiles(true);
    }

    /**
     * Test feature tiles
     *
     * @throws java.sql.SQLException
     */
    public void testFeatureTiles(boolean useIcon) throws SQLException {

        FeatureDao featureDao = FeatureTileUtils.createFeatureDao(geoPackage);

        int num = FeatureTileUtils.insertFeatures(geoPackage, featureDao);

        FeatureTiles featureTiles = FeatureTileUtils.createFeatureTiles(activity, geoPackage, featureDao, useIcon);

        try {
            FeatureIndexer indexer = new FeatureIndexer(activity, featureDao);
            try {
                indexer.index();
            } finally {
                indexer.close();
            }

            FeatureIndexManager indexManager = new FeatureIndexManager(activity, geoPackage, featureDao);
            featureTiles.setIndexManager(indexManager);

            indexManager.setIndexLocation(FeatureIndexType.GEOPACKAGE);
            int indexed = indexManager.index();
            assertEquals(num, indexed);

            createTiles(featureTiles, 0, 3);
        } finally {
            featureTiles.close();
        }
    }

    private void createTiles(FeatureTiles featureTiles, int minZoom, int maxZoom) {
        for (int i = minZoom; i <= maxZoom; i++) {
            createTiles(featureTiles, i);
        }
    }

    private void createTiles(FeatureTiles featureTiles, int zoom) {
        int tilesPerSide = TileBoundingBoxUtils.tilesPerSide(zoom);
        for (int i = 0; i < tilesPerSide; i++) {
            for (int j = 0; j < tilesPerSide; j++) {
                Bitmap bitmap = featureTiles.drawTile(i, j, zoom);
                if (bitmap != null) {
                    long count = featureTiles.queryIndexedFeaturesCount(i, j,
                            zoom);
                    assertTrue(count > 0);
                    assertEquals(featureTiles.getTileWidth(),
                            bitmap.getWidth());
                    assertEquals(featureTiles.getTileHeight(),
                            bitmap.getHeight());
                }
            }
        }
    }

}