SHELL := /usr/bin/env bash
.SUFFIXES:

OUT := build
MAIN_CLASS := Main

MODELE_BASE = \
	src/modele/Couleur.java \
	src/modele/ModeDeJeu.java \
	src/modele/Coup.java

MODELE_ECHIQUIER = \
	src/modele/Case.java \
	src/modele/Plateau.java \
	src/modele/piece/Piece.java \
	src/modele/piece/Pion.java \
	src/modele/piece/Tour.java \
	src/modele/piece/Cavalier.java \
	src/modele/piece/Fou.java \
	src/modele/piece/Reine.java \
	src/modele/piece/Roi.java

RESEAU_TYPES = \
	src/reseau/TypeMessage.java \
	src/reseau/MessageJeu.java

VUE_BASE = \
	src/vue/Vue.java \
	src/vue/VueConsole.java

JOUEURS = \
	src/modele/joueur/Joueur.java \
	src/modele/joueur/IA.java \
	src/modele/joueur/JoueurHumain.java \
	src/modele/joueur/JoueurIA.java

PARTIE = \
	src/modele/Partie.java

VUE_SWING = \
	src/vue/CaseSwingUI.java \
	src/vue/PlateauSwingUI.java \
	src/vue/ButtonEnvoyerMessageListener.java \
	src/vue/ToucheEntrerEnvoyerMessageListener.java \
	src/vue/VueGraphiqueSwing.java

CONTROLEURS_RESEAU = \
	src/controleur/ControleurReseau.java \
	src/controleur/ControleurPartie.java \
	src/reseau/Client.java \
	src/reseau/Serveur.java

MAIN = \
	src/Main.java

MODELE_BASE_OUT := $(OUT)/modele/Coup.class
MODELE_ECHIQUIER_OUT := $(OUT)/modele/piece/Roi.class
RESEAU_TYPES_OUT := $(OUT)/reseau/MessageJeu.class
VUE_BASE_OUT := $(OUT)/vue/VueConsole.class
JOUEURS_OUT := $(OUT)/modele/joueur/JoueurIA.class
PARTIE_OUT := $(OUT)/modele/Partie.class
VUE_SWING_OUT := $(OUT)/vue/VueGraphiqueSwing.class
CONTROLEURS_RESEAU_OUT := $(OUT)/controleur/ControleurPartie.class
MAIN_OUT := $(OUT)/Main.class

.PHONY: all modele reseau vue joueurs partie controleurs run clean rebuild count-files count-lines stats

all: $(MAIN_OUT)

modele: $(MODELE_ECHIQUIER_OUT)

reseau: $(RESEAU_TYPES_OUT)

vue: $(VUE_SWING_OUT)

joueurs: $(JOUEURS_OUT)

partie: $(PARTIE_OUT)

controleurs: $(CONTROLEURS_RESEAU_OUT)

$(OUT):
	mkdir -p "$(OUT)"

$(MODELE_BASE_OUT): $(MODELE_BASE) | $(OUT)
	javac -cp "$(OUT)" -d "$(OUT)" $(MODELE_BASE)

$(MODELE_ECHIQUIER_OUT): $(MODELE_ECHIQUIER) $(MODELE_BASE_OUT) | $(OUT)
	javac -cp "$(OUT)" -d "$(OUT)" $(MODELE_ECHIQUIER)

$(RESEAU_TYPES_OUT): $(RESEAU_TYPES) $(MODELE_BASE_OUT) | $(OUT)
	javac -cp "$(OUT)" -d "$(OUT)" $(RESEAU_TYPES)

$(VUE_BASE_OUT): $(VUE_BASE) $(MODELE_BASE_OUT) $(MODELE_ECHIQUIER_OUT) $(RESEAU_TYPES_OUT) | $(OUT)
	javac -cp "$(OUT)" -d "$(OUT)" $(VUE_BASE)

$(JOUEURS_OUT): $(JOUEURS) $(MODELE_BASE_OUT) $(MODELE_ECHIQUIER_OUT) $(VUE_BASE_OUT) | $(OUT)
	javac -cp "$(OUT)" -d "$(OUT)" $(JOUEURS)

$(PARTIE_OUT): $(PARTIE) $(MODELE_BASE_OUT) $(MODELE_ECHIQUIER_OUT) $(JOUEURS_OUT) | $(OUT)
	javac -cp "$(OUT)" -d "$(OUT)" $(PARTIE)

$(VUE_SWING_OUT): $(VUE_SWING) $(MODELE_BASE_OUT) $(MODELE_ECHIQUIER_OUT) $(RESEAU_TYPES_OUT) $(VUE_BASE_OUT) $(JOUEURS_OUT) $(PARTIE_OUT) | $(OUT)
	javac -cp "$(OUT)" -d "$(OUT)" $(VUE_SWING)

$(CONTROLEURS_RESEAU_OUT): $(CONTROLEURS_RESEAU) $(MODELE_BASE_OUT) $(RESEAU_TYPES_OUT) $(VUE_BASE_OUT) $(JOUEURS_OUT) $(PARTIE_OUT) | $(OUT)
	javac -cp "$(OUT)" -d "$(OUT)" $(CONTROLEURS_RESEAU)

$(MAIN_OUT): $(MAIN) $(VUE_SWING_OUT) $(CONTROLEURS_RESEAU_OUT) | $(OUT)
	javac -cp "$(OUT)" -d "$(OUT)" $(MAIN)

run: $(MAIN_OUT)
	java -cp "$(OUT)" $(MAIN_CLASS)

clean:
	rm -rf "$(OUT)"

rebuild: clean all

count-files:
	find src -type f -name '*.java' | wc -l

count-lines:
	find src -type f -name '*.java' -exec cat {} + | wc -l

stats:
	@printf "Fichiers Java: "
	@find src -type f -name '*.java' | wc -l
	@printf "Lignes Java: "
	@find src -type f -name '*.java' -exec cat {} + | wc -l
