"""Subscription API — upgrade requests, payment status, pricing."""
from flask import Blueprint, jsonify, request
from flask_login import login_required, current_user
from app.helpers.auth import admin_required

api_subscription_bp = Blueprint('api_subscription', __name__,
                                 url_prefix='/api/v1/subscription')


@api_subscription_bp.route('/my-tier')
@login_required
def my_tier():
    """Get current user's tier info."""
    from app.models.admin import Admin
    from app.models.user import User

    user = current_user._get_current_object()
    if isinstance(user, Admin):
        return jsonify({'tier': 'ultimate', 'tier_level': 3, 'is_admin': True})
    if isinstance(user, User):
        return jsonify({
            'tier': user.tier,
            'tier_level': user.tier_level,
            'is_admin': False,
        })
    return jsonify({'tier': 'free', 'tier_level': 0}), 403


@api_subscription_bp.route('/pricing')
@login_required
def pricing():
    """Get all tier pricing + upgrade costs from current user's tier."""
    from app.models.admin import Admin
    from app.models.user import User
    from app.helpers.tier_config import get_tier_pricing, get_upgrade_price, TIER_LEVELS
    from app.models.settings import AppSettings

    user = current_user._get_current_object()
    current_tier = 'free'
    if isinstance(user, User):
        current_tier = user.tier
    elif isinstance(user, Admin):
        current_tier = 'ultimate'

    tiers = get_tier_pricing()
    result = []
    for tp in tiers:
        # Only show tiers above current
        if TIER_LEVELS.get(tp.tier, 0) <= TIER_LEVELS.get(current_tier, 0):
            continue
        monthly_price = get_upgrade_price(current_tier, tp.tier, 'monthly')
        yearly_price = get_upgrade_price(current_tier, tp.tier, 'yearly')
        result.append({
            **tp.to_dict(),
            'upgrade_monthly': monthly_price,
            'upgrade_yearly': yearly_price,
        })

    qris_url = AppSettings.get('qris_image_url', '')

    return jsonify({
        'current_tier': current_tier,
        'available_tiers': result,
        'qris_url': qris_url,
    })


@api_subscription_bp.route('/upgrade-request', methods=['POST'])
@login_required
def upgrade_request():
    """Create a payment request for tier upgrade."""
    from app.models.user import User
    from app.helpers.tier_config import create_payment_request, TIER_LEVELS
    from app.models.settings import AppSettings

    user = current_user._get_current_object()
    if not isinstance(user, User):
        return jsonify({'error': 'Only users can upgrade'}), 400

    data = request.get_json(silent=True) or {}
    to_tier = data.get('to_tier', '')
    billing_cycle = data.get('billing_cycle', 'monthly')

    if to_tier not in ('starter', 'pro', 'ultimate'):
        return jsonify({'error': 'Invalid tier'}), 400
    if billing_cycle not in ('monthly', 'yearly'):
        return jsonify({'error': 'Invalid billing cycle'}), 400
    if TIER_LEVELS.get(to_tier, 0) <= TIER_LEVELS.get(user.tier, 0):
        return jsonify({'error': 'Target tier must be higher than current tier'}), 400

    payment = create_payment_request(
        user_id=user.id,
        from_tier=user.tier,
        to_tier=to_tier,
        billing_cycle=billing_cycle,
    )
    if not payment:
        return jsonify({'error': 'Could not create payment request'}), 500

    qris_url = AppSettings.get('qris_image_url', '')
    payment['qris_url'] = qris_url

    return jsonify(payment), 201


@api_subscription_bp.route('/payment-status/<int:payment_id>')
@login_required
def payment_status(payment_id):
    """Check payment status."""
    from app.models.subscription import SubscriptionPayment
    from app.models.user import User

    user = current_user._get_current_object()
    payment = SubscriptionPayment.query.get_or_404(payment_id)

    # Users can only check their own payments
    if isinstance(user, User) and payment.user_id != user.id:
        return jsonify({'error': 'Forbidden'}), 403

    return jsonify(payment.to_dict())


@api_subscription_bp.route('/my-payments')
@login_required
def my_payments():
    """Get current user's payment history."""
    from app.models.subscription import SubscriptionPayment
    from app.models.user import User

    user = current_user._get_current_object()
    if not isinstance(user, User):
        return jsonify({'payments': []})

    payments = (SubscriptionPayment.query
                .filter_by(user_id=user.id)
                .order_by(SubscriptionPayment.created_at.desc())
                .limit(20)
                .all())

    return jsonify({'payments': [p.to_dict() for p in payments]})
