# bookMaker — Justfile
# Kullanim: just <recipe>
# Kurulum: winget install casey.just  veya  scoop install just

# ~/.local/bin'i (uv buraya kuruluyor) PATH'e ekle — non-interactive shell'lerde de çalışsın
export PATH := env_var('HOME') + "/.local/bin:" + env_var('PATH')

# Kitap projeleri kök dizini — BOOKMAKER_PROJECTS_DIR env var override eder
export BOOKS_DIR := env_var_or_default('BOOKMAKER_PROJECTS_DIR', env_var('HOME') + "/projects/books")

dev:
    uv sync
    uv run pre-commit install

test:
    python3 -m pytest tests/ -q --tb=short

unit:
    python3 -m pytest tests/unit/ -q --tb=short

karpathy:
    python3 -m pytest tests/memory/ tests/discipline/ tests/eyes/ tests/test_pipeline_memory_integration.py -q --tb=short

fast:
    python3 -m pytest tests/ -q --tb=short -m "not slow" -n auto --dist=loadfile

all:
    python3 -m pytest tests/ -q

lint:
    uv run ruff check src/ tests/

# Strict mypy check for promoted modules — failures are hard errors (no - prefix).
# Add new strict modules to pyproject.toml [[tool.mypy.overrides]] first.
lint-plus-strict:
    uv run mypy src/bookmaker/core/
    uv run mypy src/bookmaker/manifest/

# Report-mode checks: soft errors, do not fail the build.
lint-plus-soft:
    uv run ruff check src/ tests/
    uv run bookmaker lint markdown README.md --no-pymarkdown
    uv run yamllint .pymarkdown.yml .yamllint.yml $BOOKS_DIR/*/book_manifest.yaml
    -uv run bookmaker lint mermaid README.md
    -uv run mypy src/bookmaker --exclude "core" --exclude "manifest"
    -uv run vulture src/ --min-confidence 80
    -uv run codespell src/ --skip "*.json,*.yaml"
    -uv run interrogate src/bookmaker -v

# Extended lint suite. Ruff + Markdown are practical gates; type/dead-code/doc/typo
# checks are report-mode until their baseline is cleaned.
lint-plus: lint-plus-strict lint-plus-soft


lint-report:
    -uv run mypy src/bookmaker
    -uv run vulture
    -uv run codespell src tests docs README.md
    -uv run yamllint .pymarkdown.yml .yamllint.yml $BOOKS_DIR/*/book_manifest.yaml
    -uv run interrogate src/bookmaker -v

fmt:
    uv run ruff format src/ tests/

check:
    uv run ruff check src/ tests/
    python3 -m pytest tests/ -q --tb=short -m "not slow"

# Final Markdown gate for VYA outputs
check-final-vya:
    uv run bookmaker check final $BOOKS_DIR/veri-yapilari-ve-algoritmalar

# Focused tests for final Markdown validation and CLI wiring
test-validator:
    uv run pytest tests/test_final_markdown_validation.py tests/cli/test_check_command.py -q

# Fast pre-commit checks without mutating files
precommit-check:
    git diff --check
    uv run ruff check src/ tests/
    uv run pytest tests/ -q --tb=short -m "not slow"

ci:
    uv run ruff check src/ tests/ --fix
    python3 -m pytest tests/ -q --tb=short -m "not slow"
    echo "CI OK"

version:
    uv run python -m bookmaker --version

studio:
    uv run python -c "from bookmaker.studio.app import run_studio; run_studio()"

help:
    uv run python -m bookmaker --help

# Run only tests relevant to currently changed files
test-changed:
    uv run python tools/utils/test_picker.py | xargs -r uv run pytest -q --tb=short

# === bookMaker Ek Recipes ===

# Symbol index — public class/function → file:line (grep yerine oku)
index:
    python3 tools/utils/build_symbol_index.py

# Proje anlık durumu (test sayısı, son commit, bölüm sayıları)
status-update:
    python3 tools/utils/update_status.py

# Oturum başı sağlık kontrolü — env, deps, tests, ruff (token harcamadan)
preflight:
    @echo "═══ bookMaker Preflight ═══"
    @python3 -c "import sys; v=sys.version_info; print(f'  Python {v.major}.{v.minor}.{v.micro}'); sys.exit(0 if v >= (3,12) else 1)"
    @command -v uv >/dev/null && echo "  uv: $(uv --version 2>&1 | head -1)" || echo "  uv: YOK (kurulum gerekli)"
    @command -v claude >/dev/null && echo "  Claude CLI: hazır" || echo "  Claude CLI: YOK (LLM çalışmaz)"
    @command -v just >/dev/null && echo "  just: $(just --version)" || echo "  just: YOK"
    @command -v ruff >/dev/null && echo "  ruff: $(ruff --version)" || echo "  ruff: YOK"
    @test -f .env && echo "  .env: var ($(grep -c '^[A-Z]' .env 2>/dev/null || echo 0) env var)" || echo "  .env: YOK (LLM modeli seçilmemiş)"
    @model=$(grep '^BOOKMAKER_GENERATION_MODEL=' .env 2>/dev/null | cut -d'=' -f2); test -n "$model" && echo "  Aktif model: $model" || echo "  Aktif model: (.env'de tanımsız)"
    @collected=$(python3 -m pytest tests/ --co -q 2>/dev/null | tail -1); echo "  Test toplama: $collected"
    @command -v ruff >/dev/null && (ruff check src/ tests/ 2>&1 | tail -1 | sed 's/^/  Ruff: /') || echo "  Ruff: atlandı"
    @echo "═══════════════════════════"

# Kitap birleştir + DOCX
build-book:
    uv run python tools/book_build.py --format both

# Batch üretim (combined prompt, varsayılan)
batch n:
    uv run python tools/batch_v2.py --batch {{n}}

# Batch üretim (iki aşamalı)
batch-two-step n:
    uv run python tools/batch_v2.py --two-step --batch {{n}}

# Git durumu
status:
    git status --short

# Git log (son N)
log n="10":
    git log --oneline -{{n}}

# Kitap bütünlük kontrolü
check-book:
    uv run python tools/book_build.py --format md 2>&1 | findstr "chars"

# PDF çıktısı (pandoc + xelatex, 54 Mermaid PNG)
pdf:
    uv run python tools/book_pdf_v3.py

# Tüm dosyaları stage'le
stage:
    git add -A

# Stage + commit + push (sadece kaynak dosyalar — generated/exports hariç)
push m="auto":
    git add src/ tests/ docs/ .gitignore *.md *.toml justfile
    git commit -m {{m}}
    git push origin main

# Branch bilgisi
branch:
    git branch -a

# Generation modülü testleri (pipeline, spec, postprocess, discipline)
gen:
    python3 -m pytest tests/unit/test_generation*.py tests/unit/test_spec*.py tests/unit/test_postprocess*.py tests/unit/test_parallel_generation.py tests/discipline/ tests/test_pipeline_memory_integration.py -q --tb=short

# Studio modülü testleri
test-studio:
    python3 -m pytest tests/unit/test_studio*.py tests/unit/test_llm*.py -q --tb=short

# Production modülü testleri (slow hariç)
prod:
    python3 -m pytest tests/production/ tests/unit/test_production*.py tests/cli/ -q --tb=short -m "not slow"

# Python sözdizimi kontrolü (API çağrısı yok)
py-check:
    python3 -m py_compile src/bookmaker/generation/pipeline.py
    python3 -m py_compile src/bookmaker/generation/spec.py
    python3 -m py_compile src/bookmaker/generation/prompts.py
    python3 -m py_compile src/bookmaker/generation/postprocess.py
    echo "Sözdizimi OK"

# VYA bölüm üretimi (manifest-tabanlı)
vya alias="bolum-01":
    uv run bookmaker generate book $BOOKS_DIR/veri-yapilari-ve-algoritmalar --alias {{alias}}

# VYA draft→final geçişi
vya-finalize alias="bolum-01":
    uv run bookmaker generate finalize $BOOKS_DIR/veri-yapilari-ve-algoritmalar --alias {{alias}}

# Tek komutla proje durumu: git + test + kitap özetleri
dashboard:
    @echo "═══════════════════════════════════════════════════════════"
    @echo "  bookMaker Dashboard — $(date '+%Y-%m-%d %H:%M')"
    @echo "═══════════════════════════════════════════════════════════"
    @echo ""
    @echo "📝 Git Durumu:"
    @git status --short | head -10 || echo "  (temiz)"
    @echo ""
    @echo "📜 Son 5 commit:"
    @git log --oneline -5
    @echo ""
    @echo "🧪 Test sayıları:"
    @python3 -m pytest tests/ --co -q 2>/dev/null | tail -1
    @echo ""
    @echo "📚 Kitap Projeleri:"
    @for d in $BOOKS_DIR/*/; do \
        name=$(basename "$d"); \
        if [ -f "$d/book_manifest.yaml" ]; then \
            ch=$(ls -d "$d"chapters/*/  2>/dev/null | wc -l); \
            final=$(find "$d"chapters/ -name "final.md" 2>/dev/null | wc -l); \
            draft=$(find "$d"chapters/ -name "draft.md" 2>/dev/null | wc -l); \
            printf "  %-45s %d bölüm | %d final | %d draft\n" "$name" "$ch" "$final" "$draft"; \
        fi; \
    done

# Prometheus + Grafana stack'i başlat (observability/)
obs-up:
    docker compose -f observability/docker-compose.yml up -d
    @echo "Prometheus: http://localhost:9090  |  Grafana: http://localhost:3000  (admin/bookmaker)"

# Prometheus + Grafana stack'i durdur
obs-down:
    docker compose -f observability/docker-compose.yml down

# Stack durumunu göster
obs-status:
    docker compose -f observability/docker-compose.yml ps
    @echo ""
