SHELL := /bin/bash

DB_LEN=57
PLAYLIST_LEN=13
DIR_LEN=3
TEST_VARS=TEST_DATABASE_EXPECTED_LEN=$(DB_LEN) TEST_DATABASE_PLAYLIST_LEN=$(PLAYLIST_LEN) TEST_DATABASE_DIR_LEN=$(DIR_LEN)

PWD=$(shell pwd)
SILENCE=\
$(PWD)/mpd/music/queue_add.mp3 \
$(PWD)/mpd/music/queue_add_http.mp3 \
$(PWD)/mpd/music/queue_add_whence_absolute.mp3 \
$(PWD)/mpd/music/queue_add_whence_beforecurrent.mp3 \
$(PWD)/mpd/music/queue_add_whence_aftercurrent.mp3 \
$(PWD)/mpd/music/queue_add_id.mp3 \
$(PWD)/mpd/music/queue_add_id_position.mp3 \
$(PWD)/mpd/music/queue_add_id_whence_beforecurrent.mp3 \
$(PWD)/mpd/music/queue_add_id_whence_aftercurrent.mp3 \
$(PWD)/mpd/music/queue_delete.mp3 \
$(PWD)/mpd/music/queue_delete_range.mp3 \
$(PWD)/mpd/music/queue_delete_id.mp3 \
$(PWD)/mpd/music/queue_move.mp3 \
$(PWD)/mpd/music/queue_move_whence.mp3 \
$(PWD)/mpd/music/queue_move_whence_aftercurrent.mp3 \
$(PWD)/mpd/music/queue_move_whence_beforecurrent.mp3 \
$(PWD)/mpd/music/queue_move_id.mp3 \
$(PWD)/mpd/music/queue_move_id_whence_absolute.mp3 \
$(PWD)/mpd/music/queue_move_id_whence_aftercurrent.mp3 \
$(PWD)/mpd/music/queue_move_id_whence_beforecurrent.mp3 \
$(PWD)/mpd/music/queue_move_range.mp3 \
$(PWD)/mpd/music/queue_move_range_whence_absolute.mp3 \
$(PWD)/mpd/music/queue_move_range_whence_aftercurrent.mp3 \
$(PWD)/mpd/music/queue_move_range_whence_beforecurrent.mp3 \
$(PWD)/mpd/music/queue_shuffle.mp3 \
$(PWD)/mpd/music/queue_swap-one.mp3 \
$(PWD)/mpd/music/queue_swap-two.mp3 \
$(PWD)/mpd/music/queue_swap_id-one.mp3 \
$(PWD)/mpd/music/queue_swap_id-two.mp3 \
$(PWD)/mpd/music/queue_add_tag_id.mp3 \
$(PWD)/mpd/music/queue_clear_tag_id.mp3 \
$(PWD)/mpd/music/queue_clear_all_tags_id.mp3 \
$(PWD)/mpd/music/queue_changes_meta.mp3 \
$(PWD)/mpd/music/queue_changes_meta_range.mp3 \
$(PWD)/mpd/music/queue_changes.mp3 \
$(PWD)/mpd/music/queue_changes_range.mp3 \
$(PWD)/mpd/music/song_added.mp3 \
$(PWD)/mpd/music/song_set_pos.mp3 \
$(PWD)/mpd/music/playlist_add_to.mp3 \
$(PWD)/mpd/music/playlist_move.mp3 \
$(PWD)/mpd/music/playlist_delete.mp3 \
$(PWD)/mpd/music/playlist_delete_range.mp3 \
$(PWD)/mpd/music/search_add.mp3 \
$(PWD)/mpd/music/search_add_playlist.mp3 \
$(PWD)/mpd/music/search_add_position.mp3 \
$(PWD)/mpd/music/player_play_id.mp3 \
$(PWD)/mpd/music/player_stop.mp3 \
$(PWD)/mpd/music/player_next.mp3 \
$(PWD)/mpd/music/player_previous.mp3 \
$(PWD)/mpd/music/player_seek_pos.mp3 \
$(PWD)/mpd/music/player_seek_id.mp3 \
$(PWD)/mpd/music/player_seek_id_f.mp3


.PHONY: test clean build kill_mpd check release clean_playlists doc

release:
	cargo build --release

build:
	cargo build

doc:
	cargo doc

check:
	RUSTFLAGS=-Dwarnings cargo check --all-features
	RUSTFLAGS=-Dwarnings cargo check --all-features --tests
	RUSTFLAGS=-Dwarnings cargo clippy --all-features
	RUSTFLAGS=-Dwarnings cargo clippy --all-features --tests
	cargo clippy --all-features -- -W clippy::pedantic
	cargo clippy --all-features --tests -- -W clippy::pedantic

test: build mpd/pid
	$(TEST_VARS) cargo test -- --test-threads=1
	cargo test -- --ignored --exact list_range_end add_create save
	cargo test -- --ignored --exact shuffle
	cargo test -- --ignored --exact clear
	cargo test -- --ignored --exact load
	cargo test -- --ignored --exact load_range
	cargo test -- --ignored --exact load_range_to
	cargo test --test player -- --ignored --test-threads=1

mpd/pid: mpd/http_pid mpd/mpd.conf kill_mpd $(SILENCE) mpd/music/dir clean_playlists
	mpd $(PWD)/mpd/mpd.conf
	mpc clear
	number=1 ; while [[ $$number -le 80 ]] ; do \
		mpc add silence.mp3 ; \
		((number = number + 1)) ; \
	done
	sleep 0.1
	mpc play
	sleep 2
	mpc pause
	mpc volume 100

mpd/mpd.conf:
	sed 's:%pwd%:$(PWD):g' $(PWD)/mpd/mpd.conf.skel > $(PWD)/mpd/mpd.conf

mpd/music/dir:
	mkdir mpd/music/dir
	pushd mpd/music/dir && ln -s ../silence.mp3 dir1.mp3
	pushd mpd/music/dir && ln -s ../silence.mp3 dir2.mp3
	pushd mpd/music/dir && ln -s ../silence.mp3 dir3.mp3
	pushd mpd/music/dir && touch file.txt

clean_playlists:
	echo "silence.mp3" > $(PWD)/mpd/playlists/clear_playlist.m3u
	echo "" > $(PWD)/mpd/playlists/add_playlist.m3u
	echo -e "silence.mp3\nsilence.mp3" > $(PWD)/mpd/playlists/add_to_playlist.m3u
	echo -e "silence.mp3\nsilence.mp3\nplaylist_move.mp3" > $(PWD)/mpd/playlists/move_playlist.m3u
	echo -e "silence.mp3\nsilence.mp3\nsilence.mp3\nplaylist_move.mp3\nplaylist_move.mp3" > $(PWD)/mpd/playlists/move_range_playlist.m3u
	echo -e "silence.mp3\nplaylist_delete.mp3\nsilence.mp3" > $(PWD)/mpd/playlists/delete_playlist.m3u
	echo -e "silence.mp3\nplaylist_delete_range.mp3\nplaylist_delete_range.mp3\nsilence.mp3" > $(PWD)/mpd/playlists/delete_range_playlist.m3u
	echo -e "silence.mp3\nsilence.mp3\nsilence.mp3\nsilence.mp3\nsilence.mp3" > $(PWD)/mpd/playlists/load_playlist.m3u
	echo -e "silence.mp3\nsilence.mp3" > $(PWD)/mpd/playlists/add_position_playlist.m3u
	echo "silence.mp3" > $(PWD)/mpd/playlists/rename.m3u
	-rm $(PWD)/mpd/playlists/add_create_playlist.m3u
	-rm $(PWD)/mpd/playlists/save_queue_create_playlist.m3u
	-rm $(PWD)/mpd/playlists/renamed.m3u
	-rm $(PWD)/mpd/playlists/search_playlist.m3u
	-touch $(PWD)/mpd/playlists/remove.m3u

mpd/http_pid:
ifeq ($(shell [ -e $(PWD)/mpd/http_pid ] && echo true), true)
	kill $(shell cat $(PWD)/mpd/http_pid)
endif
	nohup python -m http.server -b 127.0.0.1 -d $(PWD)/mpd/music/ 6601 & echo $$! > mpd/http_pid

kill_mpd: 
ifeq ($(shell [ -e $(PWD)/mpd/pid ] && echo true), true)
	kill $(shell cat $(PWD)/mpd/pid)
endif


$(SILENCE):
	pushd mpd/music && ln -s silence.mp3 $(notdir $@)

clean: kill_mpd
	-kill $(shell cat $(PWD)/mpd/http_pid)
	-rm $(PWD)/mpd/http_pid
	-rm $(PWD)/nohup.out
	-rm $(PWD)/mpd/mpd.conf
	-rm $(PWD)/mpd/database
	-rm $(PWD)/mpd/playlists/clear_playlist.m3u
	-rm $(PWD)/mpd/playlists/add_create_playlist.m3u
	-rm $(PWD)/mpd/playlists/add_playlist.m3u
	-rm $(PWD)/mpd/playlists/move_playlist.m3u
	-rm $(PWD)/mpd/playlists/move_range_playlist.m3u
	-rm $(PWD)/mpd/playlists/delete_playlist.m3u
	-rm $(PWD)/mpd/playlists/delete_range_playlist.m3u
	-rm $(PWD)/mpd/playlists/load_playlist.m3u
	-rm $(PWD)/mpd/playlists/rename.m3u
	-rm $(PWD)/mpd/playlists/renamed.m3u
	-rm $(PWD)/mpd/playlists/remove.m3u
	-rm $(PWD)/mpd/playlists/search_playlist.m3u
	-rm $(PWD)/mpd/playlists/add_position_playlist.m3u
	-rm $(SILENCE)
	-rm -r $(PWD)/mpd/music/dir
	cargo clean
