import os
import json
import psycopg2
from dotenv import load_dotenv
from pydantic import BaseModel
from reportlab.pdfgen import canvas
from io import BytesIO

# Charge les variables depuis le fichier .env
load_dotenv()

# Récupération des variables d'environnement
DB_NAME = os.getenv("DB_NAME")
DB_USER = os.getenv("DB_USER")
DB_PASS = os.getenv("DB_PASS")
DB_HOST = os.getenv("DB_HOST", "db")

# 1. Modèle de validation des données
class RapportRSE(BaseModel):
    nom: str
    score: int

# 2. Logique métier
def traiter_donnees_et_creer_pdf(data: RapportRSE):
    # Connexion DB avec variables d'environnement
    conn = psycopg2.connect(
        dbname=DB_NAME, 
        user=DB_USER, 
        password=DB_PASS, 
        host=DB_HOST
    )
    cur = conn.cursor()
    cur.execute("INSERT INTO rapports (nom, score) VALUES (%s, %s)", (data.nom, data.score))
    conn.commit()
    cur.close()
    conn.close()

    # Génération PDF en mémoire
    buffer = BytesIO()
    c = canvas.Canvas(buffer)
    c.drawString(100, 750, f"Rapport pour {data.nom}")
    c.drawString(100, 730, f"Score RSE : {data.score}")
    c.save()
    pdf_data = buffer.getvalue()
    buffer.close()
    return pdf_data

# 3. Interface WSGI
def app(environ, start_response):
    if environ['REQUEST_METHOD'] == 'POST':
        try:
            content_length = int(environ.get('CONTENT_LENGTH', 0))
            body = environ['wsgi.input'].read(content_length)
            donnees = RapportRSE(**json.loads(body))
            
            pdf = traiter_donnees_et_creer_pdf(donnees)
            
            start_response('200 OK', [('Content-Type', 'application/pdf')])
            return [pdf]
        except Exception as e:
            start_response('400 Bad Request', [('Content-Type', 'text/plain')])
            return [str(e).encode('utf-8')]
    
    start_response('404 Not Found', [('Content-Type', 'text/plain')])
    return [b"Utilisez une requete POST avec les donnees JSON."]