SHELL=cmd

###############################
# Load environment variables

include .env
export $(shell sed 's/=.*//' .env)
CURRENT_DIR = $(shell pwd)


###############################
# Create python virtual environment

.PHONY: venv-init
venv-init: ##@environment Setup virtual environment
	conda env create -f environment.yml --prefix=.venv

.PHONY: venv-activate
venv-activate: ##@environment Activates the virtual environment
	activate $(CURRENT_DIR)/.venv

.PHONY: venv-update
venv-update: ##@environment Updates to latest packages
	conda update ipykernel && conda update --prefix .venv --all

.PHONY: venv-requirements-install
venv-requirements-install: ##@environment Ensures environment.yml packages are installed
	conda env update

# To install new packages: conda install --prefix .venv PACKAGE

###############################
notebook: ##@notebooks Open jupyter notebook in venv
	activate ./.venv && jupyter notebook


###############################
# Get data from network drive
.PHONY: push-data pull-data

push-data: ##@data Copies data from ./data/ to data backup directory
	rclone copy ./data/ $(DATA_BACKUP_DIR) --exclude "*.las" --progress

# We probably don't want to pull the raw LIDAR .las files, so lets exclude them
pull-data: ##@data Copies data from data backup directory to ./data/
	rclone copy $(DATA_BACKUP_DIR) ./data/ --exclude "*.las" --progress


###############################
# Process data
.PHONY: process-mat

# Command for activating our virtual environment and calling the CLI entry point
PYTHON_CLI = activate ./.venv && python ./src/cli.py

impacts: ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv ./data/interim/impacts_forecasted_mean_slope_sto06.csv ./data/interim/impacts_observed.csv ##@products makes obsered and forecasted impacts


### Parses raw matfiles

./data/raw/processed_shorelines/orientations.mat: ./data/raw/processed_shorelines/profiles.mat
	$(MATLAB_PATH) -nosplash -r "cd $(CURRENT_DIR); run('./src/data/beach_orientations.m'); quit"

./data/interim/sites.csv ./data/interim/profiles.csv: ./data/raw/processed_shorelines/profiles.mat
	$(PYTHON_CLI) create-sites-and-profiles-csv \
	--profiles-mat "./data/raw/processed_shorelines/profiles.mat" \
	--profiles-output-file "./data/interim/profiles.csv" \
	--sites-output-file "./data/interim/sites.csv"

./data/interim/waves.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/waves.mat ./data/raw/processed_shorelines/waves.mat
	$(PYTHON_CLI) create-waves-csv \
	--waves-mat "./data/raw/processed_shorelines/waves.mat" \
	--sites-csv "./data/interim/sites.csv" \
	--waves-output-file "./data/interim/waves.csv" \
	--sites-waves-output-file "./data/interim/sites_waves.csv"

./data/interim/tides.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/tides.mat
	$(PYTHON_CLI) create-tides-csv \
	--tides-mat "./data/raw/processed_shorelines/tides.mat" \
	--sites-csv "./data/interim/sites.csv" \
	--output-file "./data/interim/tides.csv"

./data/interim/profile_features_crest_toes.csv : ./data/raw/profile_features_chris_leaman/profile_features_chris_leaman.csv
	$(PYTHON_CLI) create-crest-toes \
	--profile-features-csv "./data/raw/profile_features_chris_leaman/profile_features_chris_leaman.csv" \
	--profiles-csv "./data/interim/profiles.csv" \
	--output-file "./data/interim/profile_features_crest_toes.csv" \

./data/interim/sites_grain_size.csv : ./data/raw/grain_size/sites_grain_size.csv
	$(PYTHON_CLI) create-grain-size-csv \
	--grain-size-csv "./data/raw/grain_size/sites_grain_size.csv" \
	--output-file "./data/interim/sites_grain_size.csv" \


### TWLs

./data/interim/twl_foreshore_slope_sto06.csv: ./data/interim/waves.csv ./data/interim/tides.csv ./data/interim/profiles.csv ./data/interim/sites.csv ./data/interim/profile_features_crest_toes.csv
	$(PYTHON_CLI) create-twl-forecast \
	--waves-csv "./data/interim/waves.csv" \
	--tides-csv "./data/interim/tides.csv" \
	--profiles-csv "./data/interim/profiles.csv" \
	--profile-features-csv "./data/interim/profile_features_crest_toes.csv" \
	--grain-size-csv "./data/interim/sites_grain_size.csv" \
	--runup-function "sto06" \
	--slope "foreshore" \
	--profile-type "prestorm" \
	--output-file "./data/interim/twl_foreshore_slope_sto06.csv"

./data/interim/twl_mean_slope_sto06.csv: ./data/interim/waves.csv ./data/interim/tides.csv ./data/interim/profiles.csv ./data/interim/sites.csv ./data/interim/profile_features_crest_toes.csv
	$(PYTHON_CLI) create-twl-forecast \
	--waves-csv "./data/interim/waves.csv" \
	--tides-csv "./data/interim/tides.csv" \
	--profiles-csv "./data/interim/profiles.csv" \
	--profile-features-csv "./data/interim/profile_features_crest_toes.csv" \
	--grain-size-csv "./data/interim/sites_grain_size.csv" \
	--runup-function "sto06" \
	--slope "mean" \
	--profile-type "prestorm" \
	--output-file "./data/interim/twl_mean_slope_sto06.csv"

./data/interim/twl_mean_slope_hol86.csv: ./data/interim/waves.csv ./data/interim/tides.csv ./data/interim/profiles.csv ./data/interim/sites.csv ./data/interim/profile_features_crest_toes.csv
	$(PYTHON_CLI) create-twl-forecast \
	--waves-csv "./data/interim/waves.csv" \
	--tides-csv "./data/interim/tides.csv" \
	--profiles-csv "./data/interim/profiles.csv" \
	--profile-features-csv "./data/interim/profile_features_crest_toes.csv" \
	--grain-size-csv "./data/interim/sites_grain_size.csv" \
	--runup-function "hol86" \
	--slope "mean" \
	--profile-type "prestorm" \
	--output-file "./data/interim/twl_mean_slope_hol86.csv"

./data/interim/twl_mean_slope_nie91.csv: ./data/interim/waves.csv ./data/interim/tides.csv ./data/interim/profiles.csv ./data/interim/sites.csv ./data/interim/profile_features_crest_toes.csv
	$(PYTHON_CLI) create-twl-forecast \
	--waves-csv "./data/interim/waves.csv" \
	--tides-csv "./data/interim/tides.csv" \
	--profiles-csv "./data/interim/profiles.csv" \
	--profile-features-csv "./data/interim/profile_features_crest_toes.csv" \
	--grain-size-csv "./data/interim/sites_grain_size.csv" \
	--runup-function "nie91" \
	--slope "mean" \
	--profile-type "prestorm" \
	--output-file "./data/interim/twl_mean_slope_nie91.csv"

./data/interim/twl_mean_slope_pow18.csv: ./data/interim/waves.csv ./data/interim/tides.csv ./data/interim/profiles.csv ./data/interim/sites.csv ./data/interim/profile_features_crest_toes.csv
	$(PYTHON_CLI) create-twl-forecast \
	--waves-csv "./data/interim/waves.csv" \
	--tides-csv "./data/interim/tides.csv" \
	--profiles-csv "./data/interim/profiles.csv" \
	--profile-features-csv "./data/interim/profile_features_crest_toes.csv" \
	--grain-size-csv "./data/interim/sites_grain_size.csv" \
	--runup-function "pow18" \
	--slope "mean" \
	--profile-type "prestorm" \
	--output-file "./data/interim/twl_mean_slope_pow18.csv"

### IMPACTS

./data/interim/impacts_observed.csv: ./data/interim/profiles.csv ./data/interim/profile_features_crest_toes.csv ./data/raw/profile_features_chris_leaman/profile_features_chris_leaman.csv
	$(PYTHON_CLI) create-observed-impacts \
	--profiles-csv "./data/interim/profiles.csv" \
	--profile-features-crest-toes-csv "./data/interim/profile_features_crest_toes.csv" \
	--raw-profile-features-csv "./data/raw/profile_features_chris_leaman/profile_features_chris_leaman.csv" \
	--output-file "./data/interim/impacts_observed.csv"

./data/interim/impacts_forecasted_mean_slope_sto06.csv: ./data/interim/profile_features_crest_toes.csv ./data/interim/twl_mean_slope_sto06.csv
	$(PYTHON_CLI) create-forecasted-impacts \
	--profile-features-csv "./data/interim/profile_features_crest_toes.csv" \
	--forecasted-twl-csv "./data/interim/twl_mean_slope_sto06.csv" \
	--output-file "./data/interim/impacts_forecasted_mean_slope_sto06.csv"

./data/interim/impacts_forecasted_foreshore_slope_sto06.csv: ./data/interim/profile_features_crest_toes.csv ./data/interim/twl_foreshore_slope_sto06.csv
	$(PYTHON_CLI) create-forecasted-impacts \
	--profile-features-csv "./data/interim/profile_features_crest_toes.csv" \
	--forecasted-twl-csv "./data/interim/twl_foreshore_slope_sto06.csv" \
	--output-file "./data/interim/impacts_forecasted_foreshore_slope_sto06.csv"

./data/interim/impacts_forecasted_mean_slope_hol86.csv: ./data/interim/profile_features_crest_toes.csv ./data/interim/twl_mean_slope_hol86.csv
	$(PYTHON_CLI) create-forecasted-impacts \
	--profile-features-csv "./data/interim/profile_features_crest_toes.csv" \
	--forecasted-twl-csv "./data/interim/twl_mean_slope_hol86.csv" \
	--output-file "./data/interim/impacts_forecasted_mean_slope_hol86.csv"

./data/interim/impacts_forecasted_mean_slope_nie91.csv: ./data/interim/profile_features_crest_toes.csv ./data/interim/twl_mean_slope_nie91.csv
	$(PYTHON_CLI) create-forecasted-impacts \
	--profile-features-csv "./data/interim/profile_features_crest_toes.csv" \
	--forecasted-twl-csv "./data/interim/twl_mean_slope_nie91.csv" \
	--output-file "./data/interim/impacts_forecasted_mean_slope_nie91.csv"

./data/interim/impacts_forecasted_mean_slope_pow18.csv: ./data/interim/profile_features_crest_toes.csv ./data/interim/twl_mean_slope_pow18.csv
	$(PYTHON_CLI) create-forecasted-impacts \
	--profile-features-csv "./data/interim/profile_features_crest_toes.csv" \
	--forecasted-twl-csv "./data/interim/twl_mean_slope_pow18.csv" \
	--output-file "./data/interim/impacts_forecasted_mean_slope_pow18.csv"

### GEOJSONs

geojsons: ./data/interim/impacts_forecasted_mean_slope_nie91.geojson ./data/interim/impacts_forecasted_mean_slope_nie91_R_high.geojson ./data/interim/impacts_forecasted_mean_slope_hol86.geojson ./data/interim/impacts_forecasted_mean_slope_hol86_R_high.geojson ./data/interim/impacts_forecasted_mean_slope_sto06.geojson ./data/interim/impacts_forecasted_mean_slope_sto06_R_high.geojson ./data/interim/profile_features_crest_toes.geojson ./data/interim/sites.geojson

./data/interim/impacts_forecasted_mean_slope_sto06.geojson: ./data/interim/impacts_forecasted_mean_slope_sto06.csv ./data/interim/impacts_observed.csv
	$(PYTHON_CLI) impacts-to-geojson \
	--sites-csv "./data/interim/sites.csv" \
	--observed-impacts-csv "./data/interim/impacts_observed.csv" \
	--forecast-impacts-csv "./data/interim/impacts_forecasted_mean_slope_sto06.csv" \
	--output-geojson "./data/interim/impacts_forecasted_mean_slope_sto06.geojson"

./data/interim/impacts_forecasted_mean_slope_sto06_R_high.geojson: ./data/interim/impacts_forecasted_mean_slope_sto06.csv
	$(PYTHON_CLI) r-high-to-geojson \
	--sites-csv "./data/interim/sites.csv" \
	--profiles-csv "./data/interim/profiles.csv" \
	--crest-toes-csv "./data/interim/profile_features_crest_toes.csv" \
	--impacts-csv "./data/interim/impacts_forecasted_mean_slope_sto06.csv" \
	--output-geojson "./data/interim/impacts_forecasted_mean_slope_sto06_R_high.geojson"

./data/interim/impacts_forecasted_mean_slope_hol86.geojson: ./data/interim/impacts_forecasted_mean_slope_hol86.csv ./data/interim/impacts_observed.csv
	$(PYTHON_CLI) impacts-to-geojson \
	--sites-csv "./data/interim/sites.csv" \
	--observed-impacts-csv "./data/interim/impacts_observed.csv" \
	--forecast-impacts-csv "./data/interim/impacts_forecasted_mean_slope_hol86.csv" \
	--output-geojson "./data/interim/impacts_forecasted_mean_slope_hol86.geojson"

./data/interim/impacts_forecasted_mean_slope_hol86_R_high.geojson: ./data/interim/impacts_forecasted_mean_slope_hol86.csv
	$(PYTHON_CLI) r-high-to-geojson \
	--sites-csv "./data/interim/sites.csv" \
	--profiles-csv "./data/interim/profiles.csv" \
	--crest-toes-csv "./data/interim/profile_features_crest_toes.csv" \
	--impacts-csv "./data/interim/impacts_forecasted_mean_slope_hol86.csv" \
	--output-geojson "./data/interim/impacts_forecasted_mean_slope_hol86_R_high.geojson"

./data/interim/impacts_forecasted_mean_slope_nie91.geojson: ./data/interim/impacts_forecasted_mean_slope_nie91.csv ./data/interim/impacts_observed.csv
	$(PYTHON_CLI) impacts-to-geojson \
	--sites-csv "./data/interim/sites.csv" \
	--observed-impacts-csv "./data/interim/impacts_observed.csv" \
	--forecast-impacts-csv "./data/interim/impacts_forecasted_mean_slope_nie91.csv" \
	--output-geojson "./data/interim/impacts_forecasted_mean_slope_nie91.geojson"

./data/interim/impacts_forecasted_mean_slope_nie91_R_high.geojson: ./data/interim/impacts_forecasted_mean_slope_nie91.csv
	$(PYTHON_CLI) r-high-to-geojson \
	--sites-csv "./data/interim/sites.csv" \
	--profiles-csv "./data/interim/profiles.csv" \
	--crest-toes-csv "./data/interim/profile_features_crest_toes.csv" \
	--impacts-csv "./data/interim/impacts_forecasted_mean_slope_nie91.csv" \
	--output-geojson "./data/interim/impacts_forecasted_mean_slope_nie91_R_high.geojson"

./data/interim/profile_features_crest_toes.geojson: ./data/interim/profile_features_crest_toes.csv
	$(PYTHON_CLI) profile-features-crest-toes-to-geojson \
	--sites-csv "./data/interim/sites.csv" \
	--profile-features-csv "./data/interim/profile_features_crest_toes.csv" \
	--output-geojson "./data/interim/profile_features_crest_toes.geojson"

./data/interim/sites.geojson: ./data/interim/sites.csv
	$(PYTHON_CLI) sites-csv-to-geojson \
	--input-csv "./data/interim/sites.csv" \
	--output-geojson "./data/interim/sites.geojson"


###############################
# Misc commands
format: ./src/*.py ##@misc Check python file formatting
	activate ./.venv && black --line-length 120 "src/"


###############################
# Help command

.DEFAULT_GOAL := help
.PHONY: help

# Refer to https://gist.github.com/prwhite/8168133

#COLORS
GREEN  := $(shell tput -Txterm setaf 2)
WHITE  := $(shell tput -Txterm setaf 7)
YELLOW := $(shell tput -Txterm setaf 3)
RESET  := $(shell tput -Txterm sgr0)

# Add the following 'help' target to your Makefile
# And add help text after each target name starting with '\#\#'
# A category can be added with @category
HELP_FUN = \
	%help; \
	while(<>) { push @{$$help{$$2 // 'options'}}, [$$1, $$3] if /^([a-zA-Z\-]+)\s*:.*\#\#(?:@([a-zA-Z\-]+))?\s(.*)$$/ }; \
	print "usage: make [target]\n\n"; \
	for (sort keys %help) { \
	print "${WHITE}$$_:${RESET}\n"; \
	for (@{$$help{$$_}}) { \
	$$sep = " " x (32 - length $$_->[0]); \
	print "  ${YELLOW}$$_->[0]${RESET}$$sep${GREEN}$$_->[1]${RESET}\n"; \
	}; \
	print "\n"; }

help: ##@other Show this help.
	@perl -e '$(HELP_FUN)' $(MAKEFILE_LIST)