#!/bin/bash -eu

# Pack tiles into mbtiles database
# Based on script written by @ioctl
# Tile format: x-y-z.png, z/x-y.png

# see https://github.com/mapbox/mbtiles-spec/blob/master/1.3/spec.md

# read global configuration and functions
. vmaps.sh ||:

# read local configuration
. ./vmaps.conf ||:

if [ "$TILE_DIR" = "" ]; then
  echo "vmaps_pack_mbtiles: TILE_DIR is not set, exiting"
  exit
fi

if [ "$MBTILES" = "" ]; then
  echo "vmaps_pack_mbtiles: MBTILES is not set, exiting"
  exit
fi

# Remove output file if it exists
rm -f -- "$MBTILES"

echo "Creating $MBTILES"

# Find all tiles and put them into db
find -L "$TILE_DIR" -type f -name '*.png' | (

  echo 'CREATE TABLE tiles (tile_column int, tile_row int, zoom_level int, tile_data blob,
        PRIMARY KEY (tile_column, tile_row, zoom_level));'
  echo 'CREATE UNIQUE INDEX tile_index on tiles (zoom_level, tile_column, tile_row);'
  echo 'PRAGMA journal_mode = OFF; PRAGMA synchronous = 0;'

  while read tile; do

    xyz="$(echo "$tile" | sed -rne '
      s|^.*/([0-9]+)-([0-9]+)-([0-9]+).*$|\1 \2 \3|p
      s|^.*/([0-9]+)/([0-9]+)-([0-9]+).*$|\2 \3 \1|p
    ')"
    read x y z <<< "$xyz"

    echo -n "INSERT INTO tiles (tile_column, tile_row, "
    echo -n "zoom_level, tile_data) VALUES "
    echo    "($x, $((2**z-1-y)), $z, readfile('$tile'));"
  done

# Create metadata table
  ver=$(date +%Y-%m-%d)
  echo "CREATE TABLE metadata (name text, value text);"
  echo "INSERT INTO metadata (name, value) VALUES ('name',   '$MAP_NAME');"
  echo "INSERT INTO metadata (name, value) VALUES ('attribution', '$MAP_ATTR');"
  echo "INSERT INTO metadata (name, value) VALUES ('format', 'png');"
#  echo "INSERT INTO metadata (name, value) VALUES ('bounds', '30.0,54,42,58');"
#  echo "INSERT INTO metadata (name, value) VALUES ('center', '37.6,55.7,8');"
  echo "INSERT INTO metadata (name, value) VALUES ('version', '$ver');"
  echo "INSERT INTO metadata (name, value) VALUES ('type',    'overlay');"
  echo "INSERT INTO metadata (name, value) VALUES ('minzoom', (SELECT min(zoom_level) FROM tiles));"
  echo "INSERT INTO metadata (name, value) VALUES ('maxzoom', (SELECT max(zoom_level) FROM tiles));"
)  | sqlite3 "$MBTILES"

