from flask import Flask, request, jsonify
import fitz  # PyMuPDF
import requests
from io import BytesIO
import re

app = Flask(__name__)

API_TOKEN = "FactorX2025"

# RegEx que acepta nombres con tildes (como 'Pérez', 'Zuñiga', etc.)
NOMBRE_REGEX = re.compile(r"^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+){2,}$")

@app.route('/extract_pdf_info', methods=['POST'])
def extract_pdf_info():
    auth_header = request.headers.get("Authorization")
    if not auth_header or auth_header != f"Bearer {API_TOKEN}":
        return jsonify({"error": "Unauthorized"}), 401

    pdf_url = request.json.get('pdf_url')
    if not pdf_url:
        return jsonify({"error": "Missing pdf_url"}), 400

    response = requests.get(pdf_url)
    if response.status_code != 200:
        return jsonify({"error": "Failed to download PDF"}), 400

    pdf_data = BytesIO(response.content)
    doc = fitz.open(stream=pdf_data, filetype="pdf")

    marca = modelo = tecnico = None

    for page in doc:
        lines = page.get_text().splitlines()
        for i, line in enumerate(lines):
            # === Marca ===
            if "Marca:" in line:
                anterior = lines[i - 1].strip() if i >= 1 else ""
                siguiente = lines[i + 1].strip() if i + 1 < len(lines) else ""
                if anterior and anterior.upper() != "MODELO:":
                    marca = anterior
                elif siguiente:
                    marca = siguiente
                else:
                    marca = "Sin dato"

            # === Modelo ===
            if "Modelo:" in line:
                siguiente = lines[i + 1].strip() if i + 1 < len(lines) else ""
                if siguiente:
                    modelo = siguiente
                else:
                    modelo = "Sin dato"

        # === Buscar técnico por todas las apariciones de "Técnico"
        for i, line in enumerate(lines):
            if "Técnico" in line:
                for offset in range(1, 8):
                    if i + offset < len(lines):
                        candidato = lines[i + offset].strip()
                        if NOMBRE_REGEX.match(candidato):
                            tecnico = candidato
                            break
            if tecnico:
                break

        # === Firma del Técnico (último recurso)
        if not tecnico:
            for i, line in enumerate(lines):
                if "Firma del Técnico" in line and i + 1 < len(lines):
                    posible = lines[i + 1].strip()
                    if NOMBRE_REGEX.match(posible):
                        tecnico = posible
                        break

        # === Nombre suelto como última opción (si todo falla)
        if not tecnico:
            for line in lines:
                if NOMBRE_REGEX.match(line.strip()):
                    tecnico = line.strip()
                    break

    return jsonify({
        "marca": marca or "Sin dato",
        "modelo": modelo or "Sin dato",
        "tecnico": tecnico or "Sin dato"
    })

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5003, debug=True)
