import os
from flask import Flask, request, render_template, render_template_string, Response
from functools import wraps
from dotenv import load_dotenv

import openai
from openai import OpenAI
from openai._base_client import SyncHttpxClientWrapper
from flask import jsonify
import httpx
from coremind import CoreMind
from memory import Memory
from values import Values
from reflector import Reflector

# --- Proxy workaround ---
class CustomHttpxClientWrapper(SyncHttpxClientWrapper):
    def __init__(self, *args, **kwargs):
        kwargs.pop("proxies", None)
        super().__init__(*args, **kwargs)

openai._base_client.SyncHttpxClientWrapper = CustomHttpxClientWrapper
OpenAI._client_class = CustomHttpxClientWrapper
# ------------------------

load_dotenv()

# --- Basic Auth ---
def check_auth(username, password):
    return username == os.getenv("BASIC_USER") and password == os.getenv("BASIC_PASS")

def authenticate():
    return Response('Hozzáférés megtagadva.\nHitelesítés szükséges.', 401,
                    {'WWW-Authenticate': 'Basic realm="guardianGPT login"'})

def requires_auth(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        auth = request.authorization
        if not auth or not check_auth(auth.username, auth.password):
            return authenticate()
        return f(*args, **kwargs)
    return decorated

# --- Flask setup ---
app = Flask(__name__)
core = CoreMind()

# --- Routes ---

@app.route("/", methods=["GET", "POST"])
@requires_auth
def index():
    response = ""
    if request.method == "POST":
        user_input = request.form.get("user_input")
        if user_input:
            response = core.generate_response(user_input)
    return render_template("index.html", response=response)
    
@app.route("/ask", methods=["POST"])
@requires_auth
def ask():
    user_input = request.json.get("question", "")
    response = core.generate_response(user_input)
    return jsonify({"response": response})

@app.route("/reflect")
@requires_auth
def reflect():
    memory = Memory()
    values = Values()
    return render_template("reflect.html", memory=memory.get_recent(20), values=values.list_all())

@app.route("/teszt")
@requires_auth
def teszt():
    return render_template_string("""
        <h1>HELLO {{ nev }}!</h1>
        {% if dolgok %}
            <ul>
            {% for d in dolgok %}
              <li>{{ d }}</li>
            {% endfor %}
            </ul>
        {% else %}
            <p>Nincs semmi.</p>
        {% endif %}
    """, nev="Bogyó", dolgok=["AI", "Reflexió", "Memória"])
    
@app.route("/reflector")
@requires_auth
def reflector():
    r = Reflector()
    output = r.analyze_memory()
    return f"<pre>{output}</pre>"
