from flask import Flask, request, jsonify, abort
import os
from PyPDF2 import PdfReader

app = Flask(__name__)

# Lista di IP consentiti
ALLOWED_IPS = ['176.31.48.197']

@app.before_request
def limit_remote_addr():
    if request.remote_addr not in ALLOWED_IPS:
        abort(403)  # Rifiuta la richiesta con un errore 403 Forbidden

@app.route('/process_pdf', methods=['POST'])
def process_pdf():
    if 'file' not in request.files:
        return jsonify({'error': 'No file uploaded'}), 400

    file = request.files['file']
    if file.filename == '':
        return jsonify({'error': 'No file selected'}), 400

    # Salva temporaneamente il PDF
    file_path = os.path.join('/tmp', file.filename)
    file.save(file_path)

    # Processa il PDF
    reader = PdfReader(file_path)
    data = []

    for page in reader.pages:
        text = page.extract_text()
        lines = text.split("\n")

        for line in lines:
            parts = line.split()
            if len(parts) >= 9:  # Deve avere almeno 9 colonne
                # Identifica il codice fiscale come un valore di 16 caratteri alfanumerici
                codice_fiscale_index = next(
                    (i for i, part in enumerate(parts) if len(part) == 16 and part.isalnum()),
                    None
                )
                if codice_fiscale_index is None:
                    continue  # Se non trova il codice fiscale, salta la riga

                # Nome: l'ultima parola immediatamente prima del codice fiscale
                nome = parts[codice_fiscale_index - 1]

                # Cognome: tutte le parole prima del nome
                cognome = " ".join(parts[:codice_fiscale_index - 1])

                # Combina Nome e Cognome nell'ordine corretto
                nome_cognome = f"{nome} {cognome}"

                # Firme Entrata Reale (settima colonna rispetto al codice fiscale)
                try:
                    firme_entrata_reale = parts[codice_fiscale_index + 4]  # Settima colonna
                    firme_uscita_reale = parts[codice_fiscale_index + 3]  # Ottava colonna
                except IndexError:
                    # Evita errori di indicizzazione in caso di dati incompleti
                    firme_entrata_reale = None
                    firme_uscita_reale = None

                # Costruzione dei dati nel formato richiesto
                data.append({
                    "username": nome_cognome.strip(),
                    "created_at": firme_entrata_reale,
                    "updated_at": firme_uscita_reale
                })

    # Rimuove il file temporaneo
    os.remove(file_path)

    # Restituisce i dati estratti nel formato richiesto
    return jsonify({'data': data})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
