from flask import Flask, request, jsonify, render_template
import easyocr
import cv2
import numpy as np
import os

# Inicializar o app Flask
app = Flask(__name__, template_folder='templates')

# Inicializar o leitor EasyOCR (português)
# Primeira execução baixa o modelo (pode demorar)
try:
    reader = easyocr.Reader(['pt'], gpu=False)
except Exception as e:
    print("Erro ao carregar o EasyOCR:", e)
    reader = None

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/upload', methods=['POST'])
def upload_file():
    if reader is None:
        return jsonify({'error': 'OCR não está disponível'}), 500

    if 'file' not in request.files:
        return jsonify({'error': 'Nenhum arquivo enviado'}), 400

    file = request.files['file']
    if file.filename == '':
        return jsonify({'error': 'Nenhum arquivo selecionado'}), 400

    # Ler a imagem diretamente da memória
    file_stream = file.read()
    npimg = np.frombuffer(file_stream, np.uint8)
    img = cv2.imdecode(npimg, cv2.IMREAD_COLOR)

    if img is None:
        return jsonify({'error': 'Não foi possível ler a imagem'}), 400

    # Pré-processamento: inverter cores (fundo escuro → branco)
    img = cv2.bitwise_not(img)

    # Converter para escala de cinza
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # Binarização para melhorar contraste
    _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

    # OCR com EasyOCR
    try:
        results = reader.readtext(binary, detail=0, paragraph=False)
    except Exception as e:
        return jsonify({'error': f'Erro no OCR: {str(e)}'}), 500

    # Extrair apenas números válidos (0 a 100)
    numbers = []
    for text in results:
        # Extrai todos os dígitos da linha
        digits = ''.join(c for c in text if c.isdigit())
        if digits.isdigit():
            num = int(digits)
            if 0 <= num <= 100:
                numbers.append(str(num))

    # Retornar os valores em tabulação
    result = '\t'.join(numbers)
    return jsonify({'result': result})

if __name__ == '__main__':
    # Use host 0.0.0.0 para acessar de fora do servidor
    app.run(host='0.0.0.0', port=5000, debug=True)
