APP          ?= mmdvm-display
CXX          ?= g++
BUILD_DIR    ?= ./
SDL2_DIR ?=

EXE_EXT :=
TARGET := $(BUILD_DIR)/$(APP)$(EXE_EXT)

ifeq ($(OS),Windows_NT)
  EXE_EXT := .exe
  TARGET := $(BUILD_DIR)/$(APP)$(EXE_EXT)

  ifeq ($(strip $(SDL2_DIR)),)
    ifneq ($(findstring i686,$(notdir $(CXX))),)
      SDL2_DIR := C:/msys64/mingw32
    else
      SDL2_DIR := C:/msys64/mingw64
    endif
  endif

  SDL2_CFLAGS ?= -I$(SDL2_DIR)/include -DSDL_MAIN_HANDLED
  SDL2_LIBS   ?= -L$(SDL2_DIR)/lib -lSDL2
  DESKTOP_NET_LIBS ?= -lwininet

  ifneq ($(findstring sh,$(notdir $(SHELL))),)
    MKDIR_P = mkdir "$(BUILD_DIR)"
    RM_RF = rm -rf "$(BUILD_DIR)"
    RUN_TARGET = ./$(TARGET)
  else
    MKDIR_P = if not exist "$(BUILD_DIR)" mkdir "$(BUILD_DIR)"
    RM_RF = if exist "$(BUILD_DIR)" rmdir /S /Q "$(BUILD_DIR)"
    RUN_TARGET = $(TARGET)
  endif
else
  SDL2_PREFIX ?= $(shell pkg-config --variable=prefix sdl2 2>/dev/null || sdl2-config --prefix 2>/dev/null || echo /usr)
  SDL2_CFLAGS ?= -I$(SDL2_PREFIX)/include -DSDL_MAIN_HANDLED $(shell pkg-config --cflags-only-other sdl2 2>/dev/null)
  SDL2_LIBS   ?= $(shell pkg-config --libs sdl2 2>/dev/null || sdl2-config --libs 2>/dev/null || echo -lSDL2)
  DESKTOP_NET_LIBS ?=
  MKDIR_P = mkdir -p "$(BUILD_DIR)"
  RM_RF = rm -rf "$(BUILD_DIR)"
  RUN_TARGET = ./$(TARGET)
endif

CXXFLAGS ?= -std=c++17 -O0 -g -Wall -Wextra -fno-strict-aliasing
CPPFLAGS += -DUSE_DESKTOP -I. $(SDL2_CFLAGS)
LDLIBS   += $(SDL2_LIBS) $(DESKTOP_NET_LIBS)

.PHONY: all desktop run clean print-config

all: desktop

desktop: $(TARGET)

$(TARGET): desktop.cpp mmdvm-display/mmdvm-display.ino desktop.h desktop_json.h | $(BUILD_DIR)
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) desktop.cpp -o $@ $(LDLIBS)

$(BUILD_DIR):
	$(MKDIR_P)

run: desktop
	@echo Running $(RUN_TARGET)
	$(RUN_TARGET)

print-config:
	@echo APP=$(APP)
	@echo TARGET=$(TARGET)
	@echo CXX=$(CXX)
	@echo CXXFLAGS=$(CXXFLAGS)
	@echo CPPFLAGS=$(CPPFLAGS)
	@echo SDL2_DIR=$(SDL2_DIR)
	@echo SDL2_CFLAGS=$(SDL2_CFLAGS)
	@echo SDL2_LIBS=$(SDL2_LIBS)

clean:
	$(RM_RF)
