# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (c) 2026 0xKSor

set quiet := true

OS_NAME := os()
ARCH_NAME := arch()
HB_PREFIX := if ARCH_NAME == "aarch64" { "/opt/homebrew" } else { "/usr/local" }
export PATH := HB_PREFIX + "/bin:" + HB_PREFIX + "/sbin:" + env_var("PATH")
ACCEL := if OS_NAME == "macos" { if ARCH_NAME == "aarch64" { "-accel hvf" } else { "" } } else if ARCH_NAME == "aarch64" { "-accel kvm" } else { "" }
CPU := if ARCH_NAME == "aarch64" { "host" } else { "max" }
OVMF_ARM := if OS_NAME == "macos" { HB_PREFIX + "/share/qemu/edk2-aarch64-code.fd" } else { BUILD_DIR + "/edk2/edk2-aarch64-code.fd" }
DISPLAY_FLAGS := if OS_NAME == "macos" { "-display cocoa,show-cursor=on" } else { env_var_or_default("QEMU_DISPLAY", "-display sdl") }
ACCEL_INFO := if ACCEL == "" { "none (TCG)" } else { ACCEL }
RAM := "2G"
export BUILD_DIR := justfile_directory() + "/.build"
export TEMP_DIR := BUILD_DIR + "/temp"
export BOOT_BIN := BUILD_DIR + "/Bootloader/BOOTAA64.EFI"
export IMG_FILE := BUILD_DIR + "/ksOS.img"

mod Bootloader
mod Kernel
mod Runtime

_default:
    just --list

_prep:
    @mkdir -p {{ BUILD_DIR }}/Bootloader
    @mkdir -p {{ TEMP_DIR }}/Bootloader
    @mkdir -p {{ BUILD_DIR }}/Kernel
    @if [ "{{ OS_NAME }}" != "macos" ]; then \
        mkdir -p {{ BUILD_DIR }}/edk2; \
        if [ ! -f "{{ OVMF_ARM }}" ]; then \
            echo "⬇️  Downloading vanilla EDK2 for Linux..."; \
            curl -sL -o "{{ OVMF_ARM }}.bz2" "https://github.com/qemu/qemu/raw/master/pc-bios/edk2-aarch64-code.fd.bz2"; \
            bzip2 -d "{{ OVMF_ARM }}.bz2"; \
        fi \
    fi

@build: _prep
    @echo "🛠️ Building everything..."
    just Bootloader build
    just Kernel build
    just Runtime build

@_image: build
    @echo "💾 Creating image..."
    @dd if=/dev/zero of={{ IMG_FILE }} bs=1M count=128 status=none
    @mkfs.fat -F 32 {{ IMG_FILE }} > /dev/null
    @mmd -i {{ IMG_FILE }} ::/EFI ::/EFI/BOOT
    @mmd -i {{ IMG_FILE }} ::/System
    @mmd -i {{ IMG_FILE }} ::/Apps
    @mcopy -i {{ IMG_FILE }} {{ BOOT_BIN }} ::/EFI/BOOT/BOOTAA64.EFI
    @mcopy -i {{ IMG_FILE }} {{ BUILD_DIR }}/Kernel/ksOSKernel.elf ::/ksOSKernel.elf
    # Pack Runtime into ISO
    @if [ -d {{ BUILD_DIR }}/Runtime/System ] &&[ "$$(ls {{ BUILD_DIR }}/Runtime/System 2>/dev/null)" ]; then \
        echo "  📦 Packing System runtime..."; \
        mcopy -s -i {{ IMG_FILE }} {{ BUILD_DIR }}/Runtime/System/* ::/System/ || true; \
    fi
    @if [ -d {{ BUILD_DIR }}/Runtime/Apps ] &&[ "$$(ls {{ BUILD_DIR }}/Runtime/Apps 2>/dev/null)" ]; then \
        echo "  📦 Packing Apps runtime..."; \
        mcopy -s -i {{ IMG_FILE }} {{ BUILD_DIR }}/Runtime/Apps/* ::/Apps/ || true; \
    fi

run *FLAGS:
    #!/usr/bin/env bash
    set -e

    FLAGS=" {{ FLAGS }} "

    if [[ "$FLAGS" == *" -clean "* ]]; then
        echo "🧹 Cleaning..."
        just clean
    fi

    just _image

    DEBUG_ARGS=""
    DISPLAY_ARGS="{{ DISPLAY_FLAGS }}"
    STATE_MSG="Launching"

    if [[ "$FLAGS" == *" -debug "* ]]; then
        DEBUG_ARGS="-s -S"
        STATE_MSG="Debugging"
    fi

    if [[ "$FLAGS" == *" -nographic "* ]]; then
        DISPLAY_ARGS="-nographic"
    fi

    echo "🚀 $STATE_MSG (accel: {{ ACCEL_INFO }})..."

    qemu-system-aarch64 {{ ACCEL }} \
        -machine virt,acpi=off \
        -cpu {{ CPU }} \
        -m {{ RAM }} \
        -device ramfb \
        $DISPLAY_ARGS \
        -drive if=pflash,format=raw,readonly=on,file={{ OVMF_ARM }} \
        -drive file={{ IMG_FILE }},format=raw,if=none,id=hd0 \
        -device virtio-blk-device,drive=hd0 \
        -serial stdio \
        -monitor telnet:127.0.0.1:5555,server,nowait \
        $DEBUG_ARGS

@clean:
    just Bootloader clean
    just Kernel clean
    just Runtime clean
    rm -rf {{ BUILD_DIR }}
    rm -f compile_commands.json
    rm -f ide-swift-toolchain.txt
