from flask import Blueprint, request, jsonify
from werkzeug.security import generate_password_hash, check_password_hash
from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity
from extensions import db
from models import User
from subscription import status_assinatura, aplicar_cortesia

auth_bp = Blueprint('auth', __name__)

def montar_resposta_usuario(user):
    sub = status_assinatura(user)
    return {
        'token': create_access_token(identity=str(user.uuid)),
        'email': user.email,
        'plano': user.plano,
        'assinatura': sub,
    }

@auth_bp.route('/cadastro', methods=['POST'])
def cadastro():
    data = request.get_json()
    email = data.get('email', '').strip().lower()
    senha = data.get('senha', '')

    if not email or not senha:
        return jsonify({'erro': 'Email e senha são obrigatórios'}), 400

    if User.query.filter_by(email=email).first():
        return jsonify({'erro': 'Email já cadastrado'}), 409

    user = User(
        email=email,
        senha_hash=generate_password_hash(senha),
        plano='gratuito'
    )
    db.session.add(user)
    db.session.commit()

    return jsonify(montar_resposta_usuario(user)), 201

@auth_bp.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    email = data.get('email', '').strip().lower()
    senha = data.get('senha', '')

    user = User.query.filter_by(email=email).first()
    if not user or not check_password_hash(user.senha_hash, senha):
        return jsonify({'erro': 'Email ou senha inválidos'}), 401

    return jsonify(montar_resposta_usuario(user)), 200

@auth_bp.route('/assinatura', methods=['GET'])
@jwt_required()
def assinatura():
    user = User.query.filter_by(uuid=get_jwt_identity()).first()
    return jsonify(status_assinatura(user)), 200

@auth_bp.route('/assinatura/cortesia', methods=['POST'])
@jwt_required()
def pedir_cortesia():
    user = User.query.filter_by(uuid=get_jwt_identity()).first()
    sub = status_assinatura(user)

    if sub['status'] not in ('carencia', 'expirado'):
        return jsonify({'erro': 'Cortesia disponível apenas quando a assinatura está vencida'}), 400

    if not sub['pode_pedir_cortesia']:
        return jsonify({'erro': 'Você já utilizou a extensão de cortesia nesta conta'}), 403

    aplicar_cortesia(user)

    for p in user.pacientes:
        p.ativo = True

    db.session.commit()

    return jsonify(status_assinatura(user)), 200