#!/usr/bin/env python3
"""
Code Review Client — POST code to the fine-tuned dev model for review.

Usage:
  # Review a file
  python3 code_review_client.py --file path/to/code.py
  
  # Review inline code
  python3 code_review_client.py --code "def foo(): pass" --language python
  
  # Review with custom instructions
  python3 code_review_client.py --file code.py --prompt "Check for security issues"

Requires: llama.cpp server running on port 8081
"""

import argparse
import requests
import sys
from pathlib import Path

# llama.cpp server endpoint
SERVER_URL = "http://localhost:18181/v1/chat/completions"

SYSTEM_PROMPT = """You are an expert code reviewer. Your job is to:

1. Find bugs, logic errors, and edge cases
2. Identify security vulnerabilities
3. Flag performance issues and anti-patterns
4. Suggest cleaner, more maintainable alternatives
5. Check for missing error handling, resource cleanup, and edge cases

Be specific. Quote the problematic lines, explain WHY they're wrong, and provide corrected code.
Prioritize correctness over style. If the code is solid, say so briefly.

Format your response:
- **Issues Found:** (number)
- Each issue: description → problematic code → fix
- **Summary:** overall assessment"""


def review_code(code: str, language: str = "python", custom_prompt: str = None):
    """Send code to the fine-tuned model for review."""
    
    prompt = f"Review this {language} code:\n\n```{language}\n{code}\n```"
    if custom_prompt:
        prompt += f"\n\nFocus on: {custom_prompt}"
    
    messages = [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": prompt}
    ]
    
    payload = {
        "model": "dev-ai-27b",
        "messages": messages,
        "temperature": 0.1,  # Low temp for consistent review
        "max_tokens": 4096,
        "top_p": 0.9,
    }
    
    try:
        resp = requests.post(SERVER_URL, json=payload, timeout=120)
        resp.raise_for_status()
        result = resp.json()
        return result["choices"][0]["message"]["content"]
    
    except requests.exceptions.ConnectionError:
        print("ERROR: Cannot connect to llama.cpp server on port 8081")
        print("Start it with: ./server -m models/dev-ai-27b.Q4_K_M.gguf --port 8081")
        sys.exit(1)
    except Exception as e:
        print(f"ERROR: {e}")
        sys.exit(1)


def main():
    parser = argparse.ArgumentParser(description="Code Review Client")
    parser.add_argument("--file", "-f", help="Path to code file to review")
    parser.add_argument("--code", "-c", help="Inline code to review")
    parser.add_argument("--language", "-l", default="python", help="Programming language")
    parser.add_argument("--prompt", "-p", help="Custom review focus")
    
    args = parser.parse_args()
    
    if not args.file and not args.code:
        parser.print_help()
        sys.exit(1)
    
    if args.file:
        code = Path(args.file).read_text()
        if not args.language:
            ext = Path(args.file).suffix.lstrip(".")
            lang_map = {"py": "python", "js": "javascript", "ts": "typescript", 
                        "go": "go", "rs": "rust", "java": "java", "c": "c", 
                        "cpp": "cpp", "rb": "ruby", "php": "php"}
            args.language = lang_map.get(ext, ext)
    else:
        code = args.code
    
    print(f"Reviewing {args.language} code ({len(code)} chars)...")
    print("-" * 60)
    
    review = review_code(code, args.language, args.prompt)
    print(review)


if __name__ == "__main__":
    main()
