from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
from extensions import db
from models import User, Paciente, Palavra
from subscription import status_assinatura
import cloudinary.uploader

palavras_bp = Blueprint('palavras', __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

@palavras_bp.route('/<uuid_paciente>', methods=['GET'])
@jwt_required()
def listar(uuid_paciente):
    paciente, user = get_paciente_do_user(uuid_paciente)
    if not paciente:
        return jsonify({'erro': 'Paciente não encontrado'}), 404

    sub = status_assinatura(user)
    pode_usar_premium = sub['pode_usar_premium']

    palavras = sorted(paciente.palavras, key=lambda p: p.ordem)
    return jsonify([{
        'id': p.id,
        'texto': p.texto,
        'emoji': p.emoji,
        # Some a foto quando o plano não permite mais premium (downgrade)
        'imagem': p.imagem if pode_usar_premium else None,
        'categoria': p.categoria,
        'ordem': p.ordem
    } for p in palavras]), 200

@palavras_bp.route('/<uuid_paciente>', methods=['POST'])
@jwt_required()
def criar(uuid_paciente):
    paciente, user = get_paciente_do_user(uuid_paciente)
    if not paciente:
        return jsonify({'erro': 'Paciente não encontrado'}), 404

    sub = status_assinatura(user)
    pode_usar_premium = sub['pode_usar_premium']

    if request.content_type and 'multipart/form-data' in request.content_type:
        texto = request.form.get('texto', '').strip()
        emoji = request.form.get('emoji', '💬')
        categoria = request.form.get('categoria', 'cat-objeto')
        arquivo_imagem = request.files.get('imagem')
    else:
        data = request.get_json() or {}
        texto = data.get('texto', '').strip()
        emoji = data.get('emoji', '💬')
        categoria = data.get('categoria', 'cat-objeto')
        arquivo_imagem = None

    if not texto:
        return jsonify({'erro': 'Texto é obrigatório'}), 400

    # Garante que sempre existe um emoji-reserva, mesmo com foto
    if not emoji:
        emoji = '💬'

    imagem_url = None

    if arquivo_imagem and pode_usar_premium:
        try:
            resultado = cloudinary.uploader.upload(
                arquivo_imagem,
                folder="palavra_amiga",
                transformation=[{'width': 400, 'height': 400, 'crop': 'fill'}]
            )
            imagem_url = resultado.get('secure_url')
        except Exception as e:
            return jsonify({'erro': f'Falha ao enviar imagem: {str(e)}'}), 500

    palavra = Palavra(
        texto=texto,
        emoji=emoji,
        imagem=imagem_url,
        categoria=categoria,
        ordem=len(paciente.palavras),
        paciente_id=paciente.id
    )
    db.session.add(palavra)
    db.session.commit()
    return jsonify({'id': palavra.id, 'texto': palavra.texto, 'imagem': palavra.imagem}), 201

@palavras_bp.route('/<int:palavra_id>', methods=['PUT'])
@jwt_required()
def editar(palavra_id):
    user = User.query.filter_by(uuid=get_jwt_identity()).first()
    palavra = Palavra.query.join(Paciente).filter(
        Palavra.id == palavra_id,
        Paciente.user_id == user.id
    ).first()

    if not palavra:
        return jsonify({'erro': 'Palavra não encontrada'}), 404

    sub = status_assinatura(user)
    pode_usar_premium = sub['pode_usar_premium']

    if request.content_type and 'multipart/form-data' in request.content_type:
        texto = request.form.get('texto', '').strip()
        emoji = request.form.get('emoji', '').strip()
        categoria = request.form.get('categoria', '').strip()
        arquivo_imagem = request.files.get('imagem')
        remover_imagem = request.form.get('remover_imagem') == 'true'
    else:
        data = request.get_json() or {}
        texto = data.get('texto', '').strip()
        emoji = data.get('emoji', '').strip()
        categoria = data.get('categoria', '').strip()
        arquivo_imagem = None
        remover_imagem = data.get('remover_imagem', False)

    if texto:
        palavra.texto = texto
    if emoji:
        palavra.emoji = emoji
    if categoria:
        palavra.categoria = categoria

    if remover_imagem:
        palavra.imagem = None

    elif arquivo_imagem and pode_usar_premium:
        try:
            resultado = cloudinary.uploader.upload(
                arquivo_imagem,
                folder="palavra_amiga",
                transformation=[{'width': 400, 'height': 400, 'crop': 'fill'}]
            )
            palavra.imagem = resultado.get('secure_url')
        except Exception as e:
            return jsonify({'erro': f'Falha ao enviar imagem: {str(e)}'}), 500

    db.session.commit()
    return jsonify({
        'id': palavra.id,
        'texto': palavra.texto,
        'emoji': palavra.emoji,
        'imagem': palavra.imagem,
        'categoria': palavra.categoria
    }), 200

@palavras_bp.route('/reordenar/<uuid_paciente>', methods=['POST'])
@jwt_required()
def reordenar(uuid_paciente):
    paciente, user = get_paciente_do_user(uuid_paciente)
    if not paciente:
        return jsonify({'erro': 'Paciente não encontrado'}), 404

    data = request.get_json() or {}
    ids_em_ordem = data.get('ids', [])

    if not ids_em_ordem:
        return jsonify({'erro': 'Lista de ids é obrigatória'}), 400

    palavras_do_paciente = {p.id: p for p in paciente.palavras}

    for nova_ordem, palavra_id in enumerate(ids_em_ordem):
        palavra = palavras_do_paciente.get(palavra_id)
        if palavra:
            palavra.ordem = nova_ordem

    db.session.commit()
    return jsonify({'ok': True}), 200

@palavras_bp.route('/<int:palavra_id>', methods=['DELETE'])
@jwt_required()
def deletar(palavra_id):
    user = User.query.filter_by(uuid=get_jwt_identity()).first()
    palavra = Palavra.query.join(Paciente).filter(
        Palavra.id == palavra_id,
        Paciente.user_id == user.id
    ).first()
    if not palavra:
        return jsonify({'erro': 'Palavra não encontrada'}), 404
    db.session.delete(palavra)
    db.session.commit()
    return jsonify({'ok': True}), 200