from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
from datetime import datetime, timedelta
from sqlalchemy import func
from extensions import db
from models import User, Paciente, Palavra, Interacao
from subscription import status_assinatura

interacoes_bp = Blueprint('interacoes', __name__)

def get_paciente_do_user(uuid_paciente):
    user = User.query.filter_by(uuid=get_jwt_identity()).first()
    return Paciente.query.filter_by(uuid=uuid_paciente, user_id=user.id).first(), user

@interacoes_bp.route('/<uuid_paciente>', methods=['POST'])
@jwt_required()
def registrar(uuid_paciente):
    """
    Registra um toque numa palavra. Leve e silencioso —
    disponível em qualquer plano, para os dados já irem se acumulando.
    """
    paciente, _ = get_paciente_do_user(uuid_paciente)
    if not paciente:
        return jsonify({'erro': 'Paciente não encontrado'}), 404

    data = request.get_json() or {}
    palavra_id = data.get('palavra_id')

    palavra = Palavra.query.filter_by(id=palavra_id, paciente_id=paciente.id).first()
    if not palavra:
        return jsonify({'erro': 'Palavra não encontrada'}), 404

    interacao = Interacao(
        paciente_id=paciente.id,
        texto=palavra.texto,
        categoria=palavra.categoria
    )
    db.session.add(interacao)
    db.session.commit()
    return jsonify({'ok': True}), 201

@interacoes_bp.route('/<uuid_paciente>/relatorio', methods=['GET'])
@jwt_required()
def relatorio(uuid_paciente):
    """
    Estatísticas de uso: palavras e categorias mais usadas num período.
    Recurso Premium.
    """
    paciente, user = get_paciente_do_user(uuid_paciente)
    if not paciente:
        return jsonify({'erro': 'Paciente não encontrado'}), 404

    sub = status_assinatura(user)
    if not sub['pode_usar_premium']:
        return jsonify({'erro': 'Relatório de uso disponível apenas no plano Premium'}), 403

    dias = request.args.get('dias', default=30, type=int)
    desde = datetime.utcnow() - timedelta(days=dias)

    base_query = Interacao.query.filter(
        Interacao.paciente_id == paciente.id,
        Interacao.criado_em >= desde
    )

    total_toques = base_query.count()

    top_palavras = (
        base_query
        .with_entities(Interacao.texto, func.count(Interacao.id).label('total'))
        .group_by(Interacao.texto)
        .order_by(func.count(Interacao.id).desc())
        .limit(10)
        .all()
    )

    top_categorias = (
        base_query
        .with_entities(Interacao.categoria, func.count(Interacao.id).label('total'))
        .group_by(Interacao.categoria)
        .order_by(func.count(Interacao.id).desc())
        .all()
    )

    return jsonify({
        'periodo_dias': dias,
        'total_toques': total_toques,
        'top_palavras': [{'texto': t, 'total': n} for t, n in top_palavras],
        'top_categorias': [{'categoria': c, 'total': n} for c, n in top_categorias],
    }), 200