#!/usr/bin/make -f

VERSION ?= "$(shell git describe --tags --match "v*" --dirty --always --abbrev=8 2>/dev/null || cat VERSION 2>/dev/null || echo "develop")"
FROST_LOCODE = ./frostfs-locode-db

.PHONY: all clean version help update debpackage

DIRS = in tmp

# IGNORE
space := $(subst ,, )

# .deb package versioning
OS_RELEASE = $(shell lsb_release -cs)
PKG_VERSION ?= $(shell echo $(VERSION) | sed "s/^v//" | \
	sed -E "s/(.*)-(g[a-fA-F0-9]{6,8})(.*)/\1\3~\2/" | \
	sed "s/-/~/")-${OS_RELEASE}

# Generate locode_db BoltDB file
all: $(DIRS) $(FROST_LOCODE) locode_db

$(FROST_LOCODE):
	go build .

$(DIRS):
	@echo "⇒ Ensure dir: $@"
	@mkdir -p $@

in/airports.dat: $(DIRS)
	zcat data/airports.dat.gz > in/airports.dat

in/countries.dat: $(DIRS)
	zcat data/countries.dat.gz > in/countries.dat

in/continents.geojson: $(DIRS)
	zcat data/continents.geojson.gz > in/continents.geojson

in/unlocode-SubdivisionCodes.csv: $(DIRS)
	zcat data/unlocode-SubdivisionCodes.csv.gz > in/unlocode-SubdivisionCodes.csv

in/unlocode-CodeList.csv: $(DIRS)
	zcat data/unlocode-CodeList.csv.gz > in/unlocode-CodeList.csv

# Generate locode_db BoltDB file
locode_db: in/unlocode-CodeList.csv in/unlocode-SubdivisionCodes.csv in/continents.geojson in/airports.dat in/countries.dat $(FROST_LOCODE)
	$(FROST_LOCODE) generate \
	--airports in/airports.dat \
	--continents in/continents.geojson \
	--countries in/countries.dat \
	--in in/unlocode-CodeList.csv \
	--subdiv in/unlocode-SubdivisionCodes.csv \
	--out locode_db
	chmod 644 locode_db

# IGNORE
# Openflights doesn't have tags or releases, so update would always take latest master version.
# See https://github.com/jpatokal/openflights
data/airports.dat.gz: $(DIRS)
	wget -c https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat -O tmp/airports.dat && \
  gzip -c tmp/airports.dat > data/airports.dat.gz

data/countries.dat.gz: $(DIRS)
	wget -c https://raw.githubusercontent.com/jpatokal/openflights/master/data/countries.dat -O tmp/countries.dat && \
  gzip -c tmp/countries.dat > data/countries.dat.gz

# IGNORE
# See https://unece.org/trade/cefact/UNLOCODE-Download
tmp/locode.csv.zip :$(DIRS)
	DOWNLOADURL=$$(wget -O - https://unece.org/trade/cefact/UNLOCODE-Download \
		| grep -oP '(?<=href=")\S+loc\d+csv\.zip'); \
	echo "$$DOWNLOADURL" | grep -oP '(?<=loc)\d+' > tmp/locode-version.txt; \
	wget -c "$$DOWNLOADURL" -O tmp/locode.csv.zip

data/unlocode-SubdivisionCodes.csv.gz: tmp/locode.csv.zip
	unzip -p tmp/locode.csv.zip "*SubdivisionCodes.csv" | gzip > data/unlocode-SubdivisionCodes.csv.gz

data/unlocode-CodeList.csv.gz:  tmp/locode.csv.zip
	unzip -p tmp/locode.csv.zip "*CodeListPart*" | gzip > data/unlocode-CodeList.csv.gz

# Download and repack external data-sources
update: data/unlocode-CodeList.csv.gz data/unlocode-SubdivisionCodes.csv.gz data/countries.dat.gz data/airports.dat.gz

# Print version
version:
	@echo $(VERSION)

# Show this help prompt
help:
	@echo '  Usage:'
	@echo ''
	@echo '    make <target>'
	@echo ''
	@echo '  Targets:'
	@echo ''
	@awk '/^#/{ comment = substr($$0,3) } comment && /^[a-zA-Z][a-zA-Z0-9_-]+ ?:/{ print "   ", $$1, comment }' $(MAKEFILE_LIST) | column -t -s ':' | grep -v 'IGNORE' | sort -u

# Run tests
test: locode_db
	test -n "$$($(FROST_LOCODE) info --db locode_db --locode "US NYC" 2>&1 | grep "New York")"
	test -n "$$($(FROST_LOCODE) info --db locode_db --locode "RU LED" 2>&1 | grep "Leningrad")"
	test -n "$$($(FROST_LOCODE) info --db locode_db --locode "RU KUF" 2>&1 | grep "Samara")"
	test -n "$$($(FROST_LOCODE) info --db locode_db --locode "VN DAN" 2>&1 | grep "Binh Hoa")"
	test -n "$$($(FROST_LOCODE) info --db locode_db --locode "FR PAR" 2>&1 | grep "Paris")"

# Clean data directory before update
clean_data:
	rm -f data/unlocode-CodeList.csv.gz
	rm -f data/unlocode-SubdivisionCodes.csv.gz
	rm -f data/countries.dat.gz
	rm -f data/airports.dat.gz

# Clean up
clean:
	rm -f in/*
	rm -f tmp/*
	rm -f locode_db
	rm -f $(FROST_LOCODE)

# Package for Debian
debpackage:
	dch --package frostfs-locode-db \
		--controlmaint \
		--newversion $(PKG_VERSION) \
		--force-bad-version \
		--distribution $(OS_RELEASE) \
		"Please see CHANGELOG.md for code changes for $(VERSION)"
	dpkg-buildpackage --no-sign -b

# Clean up debian packaging leftovers
debclean:
	dh clean