ifeq ($(OS),Windows_NT)
    DETECTED_OS := Windows
    RM := del /Q
    RMDIR := rmdir /S /Q
    ARCH_RAW := $(PROCESSOR_ARCHITECTURE)
    BIN_EXT := .exe
    MKDIR_P = if not exist "$(1)" mkdir "$(1)"
    RUN_PREFIX :=
else
    DETECTED_OS := $(shell uname -s)
    RM := rm -f
    RMDIR := rm -rf
    ARCH_RAW := $(shell uname -m)
    BIN_EXT :=
    MKDIR_P = mkdir -p "$(1)"
    RUN_PREFIX := ./
endif

ifneq (,$(filter x86_64 amd64 AMD64 x86 i386 i486 i586 i686,$(ARCH_RAW)))
    ARCH := x86
else ifneq (,$(filter aarch64 arm64 ARM64 armv7l armv6l arm,$(ARCH_RAW)))
    ARCH := arm
else ifneq (,$(filter ppc64 ppc64le powerpc,$(ARCH_RAW)))
    ARCH := powerpc
else
    ARCH := $(ARCH_RAW)
endif

CC ?= cc
CFLAGS ?= -std=c99 -Wall -Wextra -Iinclude

BUILD_DIR := build/$(ARCH)
BIN_DIR := $(BUILD_DIR)/bin
TEST_DIR := $(BUILD_DIR)/.tests
BIN := $(BIN_DIR)/micropascal$(BIN_EXT)
TEST_BIN := $(TEST_DIR)/micropascal-tests$(BIN_EXT)

LIB_SRCS := $(wildcard src/micropascal-lexer/*.c) $(wildcard src/micropascal-parser/*.c)
APP_SRCS := src/main.c $(LIB_SRCS)
TEST_SRCS := tests/test_main.c tests/test_lexer.c tests/test_parser.c $(LIB_SRCS)

ARGS ?= examples/testaparidade.pas

.PHONY: help all build run test clean

help:
	@echo "micro-Pascal - alvos disponiveis"
	@echo "  make help    mostra esta ajuda"
	@echo "  make build   compila o compilador em $(BIN)"
	@echo "  make run     compila e executa em uma amostra (ARGS=arquivo)"
	@echo "  make test    compila e executa a suite de testes"
	@echo "  make clean   remove o diretorio build"

all: build

build: $(BIN)

$(BIN): $(APP_SRCS)
	@$(call MKDIR_P,$(BIN_DIR))
	$(CC) $(CFLAGS) $(APP_SRCS) -o $(BIN)

$(TEST_BIN): $(TEST_SRCS)
	@$(call MKDIR_P,$(TEST_DIR))
	$(CC) $(CFLAGS) $(TEST_SRCS) -o $(TEST_BIN)

run: build
	$(RUN_PREFIX)$(BIN) $(ARGS)

test: $(TEST_BIN)
	$(RUN_PREFIX)$(TEST_BIN)

clean:
	$(RMDIR) build
