#!/usr/bin/env python3
"""
Hardcode Audit Teszt és Gitea Integráció

Ez a szkript:
1. Szkennel a backend/app/services/ és backend/app/api/ mappákban hardcode értékeket
2. Generál egy Markdown riportot a találatokról
3. Létrehoz egy mérföldkövet és 4 issue-t a Gitea-ban az admin rendszer fejlesztéséhez
"""

import os
import re
import sys
import subprocess
from pathlib import Path
from typing import List, Dict, Tuple

# ==================== KONFIGURÁCIÓ ====================
PROJECT_ROOT = Path(__file__).parent.parent.parent.parent  # /opt/docker/dev/service_finder
GITEA_SCRIPT = PROJECT_ROOT / ".roo" / "scripts" / "gitea_manager.py"

SCAN_DIRS = [
    PROJECT_ROOT / "backend" / "app" / "services",
    PROJECT_ROOT / "backend" / "app" / "api",
]

# Hardcode minta regexek
HARDCODE_PATTERNS = [
    (r'\b\d{1,3}\b', "Mágikus szám (1-3 jegyű)"),
    (r'\b(50|10|100|1000|5000|10000)\b', "Gyakori mágikus szám (pl. 50, 10)"),
    (r'"(active|inactive|pending|approved|rejected|blocked)"', "Fix státusz string"),
    (r"'active'|'inactive'|'pending'|'approved'|'rejected'|'blocked'", "Fix státusz string (aposztróf)"),
    (r'\b(True|False)\b', "Hardcode boolean"),
    (r'\b(max|min|limit|threshold|default)\s*=\s*\d+', "Limit/Threshold érték"),
]

# ==================== SEGÉDFÜGGVÉNYEK ====================

def find_python_files(directory: Path) -> List[Path]:
    """Rekurzívan gyűjti össze az összes .py fájlt a megadott könyvtárban."""
    python_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith('.py'):
                python_files.append(Path(root) / file)
    return python_files

def scan_file(file_path: Path) -> List[Dict]:
    """Egy fájlban keres hardcode értékeket a regex minták alapján."""
    findings = []
    try:
        content = file_path.read_text(encoding='utf-8')
        lines = content.splitlines()
        
        for line_num, line in enumerate(lines, 1):
            for pattern, description in HARDCODE_PATTERNS:
                matches = re.finditer(pattern, line)
                for match in matches:
                    findings.append({
                        'file': str(file_path.relative_to(PROJECT_ROOT)),
                        'line': line_num,
                        'column': match.start() + 1,
                        'match': match.group(),
                        'description': description,
                        'context': line.strip()[:100]
                    })
    except Exception as e:
        print(f"⚠️ Hiba a fájl olvasásakor {file_path}: {e}")
    
    return findings

def generate_markdown_report(findings: List[Dict]) -> str:
    """Generál egy Markdown formátumú riportot a találatokról."""
    if not findings:
        return "## ✅ Nincs hardcode találat\n\nA szkennelés nem talált gyanús hardcode értékeket."
    
    # Csoportosítás fájl szerint
    by_file = {}
    for finding in findings:
        file = finding['file']
        if file not in by_file:
            by_file[file] = []
        by_file[file].append(finding)
    
    report_lines = [
        "# 🔍 Hardcode Audit Részletes Részletek",
        "",
        f"**Összes találat:** {len(findings)}",
        "",
        "---",
    ]
    
    for file, file_findings in sorted(by_file.items()):
        report_lines.append(f"## 📄 {file}")
        report_lines.append("")
        
        for finding in file_findings:
            report_lines.append(f"### L{ finding['line'] }: `{ finding['match'] }`")
            report_lines.append(f"- **Leírás:** {finding['description']}")
            report_lines.append(f"- **Kontextus:** `{finding['context']}`")
            report_lines.append(f"- **Hely:** {finding['file']}:{finding['line']}:{finding['column']}")
            report_lines.append("")
    
    return "\n".join(report_lines)

def run_gitea_command(args: List[str]) -> Tuple[bool, str]:
    """Futtat egy Gitea manager parancsot."""
    cmd = ["docker", "exec", "roo-helper", "python3", "/scripts/gitea_manager.py"] + args
    try:
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
        return result.returncode == 0, result.stdout + "\n" + result.stderr
    except subprocess.TimeoutExpired:
        return False, "Időtúllépés a parancs futtatásakor"
    except Exception as e:
        return False, f"Hiba: {e}"

def create_milestone() -> bool:
    """Létrehozza a 'v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig' mérföldkövet."""
    print("📌 Mérföldkő létrehozása...")
    success, output = run_gitea_command([
        "ms", "create", "v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig",
        "Admin rendszer fejlesztése: RBAC, dinamikus konfiguráció, anomália detektálás"
    ])
    if success:
        print("✅ Mérföldkő sikeresen létrehozva")
    else:
        print(f"⚠️ Figyelmeztetés: {output}")
    return success

def create_issue(title: str, body: str, labels: List[str]) -> bool:
    """Létrehoz egy issue-t a Gitea-ban."""
    print(f"📝 Issue létrehozása: {title}")
    
    # Build the command
    cmd = ["create", f'"{title}"', f'"{body}"', "v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig"]
    cmd.extend(labels)
    
    success, output = run_gitea_command(cmd)
    if success:
        print(f"✅ Issue sikeresen létrehozva: {title}")
    else:
        print(f"⚠️ Hiba az issue létrehozásakor: {output}")
    return success

def create_gitea_issues(markdown_report: str):
    """Létrehozza a 4 issue-t a Gitea-ban a megadott sablonnal."""
    
    # Issue 1: Hardcode értékek dinamikussá tétele
    issue1_body = f"""**Mérföldkő:** v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig
**Cél:** Hardcode értékek kiszervezése SystemParameter táblába és ConfigService-be

### 🔗 Függőségek (Dependencies)
- **Bemenet (Mikre támaszkodik):** Database (system.parameters tábla), ConfigService
- **Kimenet (Mik támaszkodnak rá):** GamificationService, NotificationService, SecurityService

### 📝 Elemzés
A hardcode audit {len(markdown_report.splitlines())} sor találatot jelentett. Ezeket az értékeket át kell helyezni a dinamikus konfigurációs rendszerbe.

### 🔍 Hardcode Találatok (Összefoglaló)
{markdown_report[:2000]}...
"""
    
    # Issue 2: RBAC és Admin API Router
    issue2_body = """**Mérföldkő:** v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig
**Cél:** Superadmin, Moderator szerepkörök és `/api/v1/admin` végpontok implementálása

### 🔗 Függőségek (Dependencies)
- **Bemenet (Mikre támaszkodik):** Identity modell (User, Role), Permission tábla
- **Kimenet (Mik támaszkodnak rá):** Admin UI, Moderátori felület

### 📝 Elemzés
Létre kell hozni a Role-Based Access Control (RBAC) rendszert, amely támogatja a Superadmin, Moderator, és Auditor szerepköröket. Az admin végpontoknak külön routerben kell lenniük, és JWT token alapú autorizációt kell használniuk.
"""
    
    # Issue 3: Core Felügyeleti Végpontok
    issue3_body = """**Mérföldkő:** v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig
**Cél:** User (KYC), Jármű, Szerviz felügyelet (Tiltás/Jóváhagyás) végpontok

### 🔗 Függőségek (Dependencies)
- **Bemenet (Mikre támaszkodik):** UserService, VehicleService, ServiceRegistry
- **Kimenet (Mik támaszkodnak rá):** Admin dashboard, Moderátori munkafolyamatok

### 📝 Elemzés
Külön végpontok kellenek a felhasználók KYC (Know Your Customer) jóváhagyásához, járművek tiltásához/engedélyezéséhez, és szervizek moderálásához. Minden művelet naplózandó az audit logba.
"""
    
    # Issue 4: Anomália Detektálás (Anti-Cheat)
    issue4_body = """**Mérföldkő:** v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig
**Cél:** Robot felügyelő a gyanús aktivitásokhoz (pl. túl gyors pontgyűjtés, sok sikertelen bejelentkezés)

### 🔗 Függőségek (Dependencies)
- **Bemenet (Mikre támaszkodik):** Audit log, Gamification events, Security events
- **Kimenet (Mik támaszkodnak rá):** Admin értesítések, Automatikus tiltások

### 📝 Elemzés
Anomália detektáló algoritmus készítése, amely gyanús mintákat keres a felhasználói aktivitásban. A rendszer automatikusan jelzést küld és/vagy ideiglenesen tiltja a gyanús fiókokat.
"""
    
    # Issue létrehozások
    issues = [
        ("Phase 1: Hardcode Értékek Dinamikussá Tétele", issue1_body, ["Scope: Backend", "Type: Refactor"]),
        ("Phase 2: RBAC és Admin API Router", issue2_body, ["Scope: Backend", "Type: Feature"]),
        ("Phase 3: Core Felügyeleti Végpontok", issue3_body, ["Scope: API", "Type: Feature"]),
        ("Phase 4: Anomália Detektálás (Anti-Cheat)", issue4_body, ["Scope: Core", "Type: Feature"]),
    ]
    
    for title, body, labels in issues:
        create_issue(title, body, labels)

# ==================== FŐPROGRAM ====================

def main():
    print("🔍 Hardcode Audit Szkennelés indítása...")
    
    # 1. Python fájlok gyűjtése
    all_files = []
    for scan_dir in SCAN_DIRS:
        if scan_dir.exists():
            all_files.extend(find_python_files(scan_dir))
        else:
            print(f"⚠️ A könyvtár nem létezik: {scan_dir}")
    
    print(f"📁 Összesen {len(all_files)} fájl található a szkenneléshez")
    
    # 2. Hardcode értékek keresése
    all_findings = []
    for file in all_files:
        findings = scan_file(file)
        all_findings.extend(findings)
    
    print(f"🔎 {len(all_findings)} hardcode találat")
    
    # 3. Markdown riport generálása
    markdown_report = generate_markdown_report(all_findings)
    
    # 4. Riport mentése fájlba (opcionális)
    report_path = PROJECT_ROOT / "hardcode_audit_report.md"
    report_path.write_text(markdown_report, encoding='utf-8')
    print(f"📄 Részletes riport mentve: {report_path}")
    
    # 5. Gitea integráció
    print("\n🚀 Gitea Integráció indítása...")
    
    # Ellenőrizzük, hogy a Gitea script létezik-e
    if not GITEA_SCRIPT.exists():
        print(f"❌ A Gitea manager script nem található: {GITEA_SCRIPT}")
        print("A szkript csak a riportot generálta, Gitea műveletek kihagyva.")
        return
    
    # Mérföldkő létrehozása
    create_milestone()
    
    # Issue-ok létrehozása
    create_gitea_issues(markdown_report)
    
    print("\n✅ Audit szkript sikeresen lefutott!")
    print(f"   - Találatok: {len(all_findings)}")
    print(f"   - Riport: {report_path}")
    print("   - Gitea issue-k létrehozva a 'v2.0 - Enterprise Admin Rendszer & Dinamikus Konfig' mérföldkő alatt")

if __name__ == "__main__":
    main()