"""
Subscription API Routes
مدیریت اشتراک‌های کاربران
"""

from flask import Blueprint, request, jsonify
from flask_login import login_required, current_user
from app import db, limiter
from app.models.user import User
from datetime import datetime, timedelta
import uuid

subscription_api = Blueprint('subscription_api', __name__)

# پلن‌های اشتراک
SUBSCRIPTION_PLANS = {
    'monthly': {
        'name': 'ماهیانه',
        'name_en': 'Monthly',
        'price': 49,
        'currency': 'EUR',
        'duration_months': 1,
        'duration_days': 30,
        'features': ['تحلیل لحظه‌ای بازار', 'دسترسی به API', 'هشدارهای قیمتی', 'پشتیبانی ایمیل']
    },
    'quarterly': {
        'name': 'سه ماهه',
        'name_en': 'Quarterly',
        'price': 129,
        'currency': 'EUR',
        'duration_months': 3,
        'duration_days': 90,
        'features': ['تحلیل لحظه‌ای بازار', 'دسترسی به API', 'هشدارهای قیمتی', 'تحلیل هوشمند AI', 'پشتیبانی優先'],
        'save': 18
    },
    'biannual': {
        'name': 'شش ماهه',
        'name_en': '6 Months',
        'price': 239,
        'currency': 'EUR',
        'duration_months': 6,
        'duration_days': 180,
        'features': ['تحلیل لحظه‌ای بازار', 'دسترسی به API', 'هشدارهای قیمتی', 'تحلیل هوشمند AI', 'گزارش‌های حرفه‌ای', 'پشتیبانی優先'],
        'save': 20
    },
    'yearly': {
        'name': 'سالانه',
        'name_en': 'Yearly',
        'price': 449,
        'currency': 'EUR',
        'duration_months': 12,
        'duration_days': 365,
        'features': ['تحلیل لحظه‌ای بازار', 'دسترسی به API', 'هشدارهای قیمتی', 'تحلیل هوشمند AI', 'گزارش‌های حرفه‌ای', 'API پیشرفته', 'پشتیبانی VIP', 'مشاوره ماهانه'],
        'save': 25
    }
}


@subscription_api.route('/plans', methods=['GET'])
def get_subscription_plans():
    """دریافت لیست پلن‌های اشتراک"""
    return jsonify({
        'plans': SUBSCRIPTION_PLANS,
        'status': 'success'
    })


@subscription_api.route('/current', methods=['GET'])
@login_required
def get_current_subscription():
    """دریافت اطلاعات اشتراک فعلی کاربر"""
    return jsonify({
        'subscription': {
            'plan': current_user.subscription_plan,
            'plan_name': SUBSCRIPTION_PLANS.get(current_user.subscription_plan, {}).get('name', 'رایگان'),
            'status': current_user.subscription_status,
            'start_date': current_user.subscription_start.isoformat() if current_user.subscription_start else None,
            'end_date': current_user.subscription_end.isoformat() if current_user.subscription_end else None,
            'days_left': current_user.get_subscription_days_left(),
            'is_active': current_user.has_active_subscription()
        },
        'status': 'success'
    })


@subscription_api.route('/activate', methods=['POST'])
@login_required
def activate_subscription():
    """فعال کردن اشتراک (بعد از پرداخت)"""
    data = request.get_json()
    plan = data.get('plan')
    transaction_id = data.get('transaction_id')
    payment_method = data.get('payment_method', 'unknown')
    
    if plan not in SUBSCRIPTION_PLANS:
        return jsonify({'error': 'Invalid subscription plan'}), 400
    
    plan_info = SUBSCRIPTION_PLANS[plan]
    
    # فعال کردن اشتراک
    current_user.activate_subscription(plan, plan_info['duration_months'])
    current_user.last_payment_date = datetime.utcnow()
    current_user.payment_method = payment_method
    current_user.transaction_id = transaction_id
    
    db.session.commit()
    
    return jsonify({
        'message': f'Subscription activated successfully',
        'subscription': {
            'plan': current_user.subscription_plan,
            'end_date': current_user.subscription_end.isoformat(),
            'days_left': current_user.get_subscription_days_left()
        },
        'status': 'success'
    })


@subscription_api.route('/cancel', methods=['POST'])
@login_required
def cancel_subscription():
    """لغو اشتراک"""
    if current_user.subscription_plan == 'free':
        return jsonify({'error': 'No active subscription to cancel'}), 400
    
    current_user.cancel_subscription()
    db.session.commit()
    
    return jsonify({
        'message': 'Subscription cancelled successfully',
        'status': 'success'
    })


# ============================================
# Admin Subscription Management Routes
# ============================================

@subscription_api.route('/admin/users', methods=['GET'])
@login_required
def admin_get_users_with_subscriptions():
    """ادمین: دریافت لیست کاربران با اطلاعات اشتراک"""
    if not current_user.is_admin:
        return jsonify({'error': 'Admin access required'}), 403
    
    users = User.query.all()
    
    users_data = []
    for user in users:
        users_data.append({
            'id': user.id,
            'username': user.username,
            'email': user.email,
            'subscription_plan': user.subscription_plan,
            'subscription_status': user.subscription_status,
            'subscription_end': user.subscription_end.isoformat() if user.subscription_end else None,
            'days_left': user.get_subscription_days_left(),
            'is_active': user.is_active,
            'is_admin': user.is_admin,
            'last_login': user.last_login.isoformat() if user.last_login else None,
            'created_at': user.created_at.isoformat() if user.created_at else None
        })
    
    # آمار اشتراک‌ها
    stats = {
        'total_users': len(users),
        'active_subscriptions': User.query.filter(User.subscription_status == 'active').count(),
        'expired_subscriptions': User.query.filter(User.subscription_status == 'expired').count(),
        'free_users': User.query.filter(User.subscription_plan == 'free').count(),
        'monthly_users': User.query.filter(User.subscription_plan == 'monthly').count(),
        'quarterly_users': User.query.filter(User.subscription_plan == 'quarterly').count(),
        'biannual_users': User.query.filter(User.subscription_plan == 'biannual').count(),
        'yearly_users': User.query.filter(User.subscription_plan == 'yearly').count(),
        'total_revenue_monthly': User.query.filter(User.subscription_plan == 'monthly').count() * 49,
        'total_revenue_quarterly': User.query.filter(User.subscription_plan == 'quarterly').count() * 129,
        'total_revenue_biannual': User.query.filter(User.subscription_plan == 'biannual').count() * 239,
        'total_revenue_yearly': User.query.filter(User.subscription_plan == 'yearly').count() * 449,
    }
    
    return jsonify({
        'users': users_data,
        'statistics': stats,
        'plans': SUBSCRIPTION_PLANS,
        'status': 'success'
    })


@subscription_api.route('/admin/users/<int:user_id>/subscription', methods=['PUT'])
@login_required
def admin_update_user_subscription(user_id):
    """ادمین: به روز رسانی اشتراک کاربر"""
    if not current_user.is_admin:
        return jsonify({'error': 'Admin access required'}), 403
    
    user = User.query.get_or_404(user_id)
    data = request.get_json()
    
    plan = data.get('plan')
    action = data.get('action')  # activate, extend, cancel, expire
    
    if plan and plan not in SUBSCRIPTION_PLANS and plan != 'free':
        return jsonify({'error': 'Invalid subscription plan'}), 400
    
    if action == 'activate':
        if plan == 'free':
            user.subscription_plan = 'free'
            user.subscription_status = 'active'
            user.subscription_end = None
        else:
            plan_info = SUBSCRIPTION_PLANS[plan]
            user.activate_subscription(plan, plan_info['duration_months'])
        
        user.is_active = True
        message = f'Subscription activated for user {user.username}'
        
    elif action == 'extend':
        extra_months = data.get('extra_months', 1)
        if user.subscription_end:
            user.subscription_end = user.subscription_end + timedelta(days=extra_months * 30)
        else:
            user.subscription_end = datetime.utcnow() + timedelta(days=extra_months * 30)
        user.subscription_status = 'active'
        user.is_active = True
        message = f'Subscription extended by {extra_months} months for user {user.username}'
        
    elif action == 'cancel':
        user.cancel_subscription()
        message = f'Subscription cancelled for user {user.username}'
        
    elif action == 'expire':
        user.expire_subscription()
        message = f'Subscription expired for user {user.username}'
        
    else:
        return jsonify({'error': 'Invalid action'}), 400
    
    db.session.commit()
    
    return jsonify({
        'message': message,
        'user': {
            'id': user.id,
            'username': user.username,
            'subscription_plan': user.subscription_plan,
            'subscription_status': user.subscription_status,
            'subscription_end': user.subscription_end.isoformat() if user.subscription_end else None,
            'is_active': user.is_active
        },
        'status': 'success'
    })


@subscription_api.route('/admin/check-expired', methods=['POST'])
@login_required
def admin_check_expired_subscriptions():
    """ادمین: بررسی و غیرفعال کردن اشتراک‌های منقضی شده"""
    if not current_user.is_admin:
        return jsonify({'error': 'Admin access required'}), 403
    
    now = datetime.utcnow()
    expired_users = User.query.filter(
        User.subscription_status == 'active',
        User.subscription_end < now,
        User.subscription_plan != 'free'
    ).all()
    
    expired_count = 0
    for user in expired_users:
        user.expire_subscription()
        expired_count += 1
    
    db.session.commit()
    
    return jsonify({
        'message': f'Checked and expired {expired_count} subscriptions',
        'expired_count': expired_count,
        'status': 'success'
    })


@subscription_api.route('/admin/stats/revenue', methods=['GET'])
@login_required
def admin_get_revenue_stats():
    """ادمین: دریافت آمار درآمد"""
    if not current_user.is_admin:
        return jsonify({'error': 'Admin access required'}), 403
    
    # آمار ماه جاری
    now = datetime.utcnow()
    start_of_month = datetime(now.year, now.month, 1)
    
    new_subscriptions_this_month = User.query.filter(
        User.subscription_start >= start_of_month,
        User.subscription_plan != 'free'
    ).count()
    
    # درآمد تخمینی
    monthly_revenue = User.query.filter(User.subscription_plan == 'monthly').count() * 49
    quarterly_revenue = User.query.filter(User.subscription_plan == 'quarterly').count() * 129
    biannual_revenue = User.query.filter(User.subscription_plan == 'biannual').count() * 239
    yearly_revenue = User.query.filter(User.subscription_plan == 'yearly').count() * 449
    
    total_revenue = monthly_revenue + quarterly_revenue + biannual_revenue + yearly_revenue
    
    return jsonify({
        'revenue': {
            'monthly': monthly_revenue,
            'quarterly': quarterly_revenue,
            'biannual': biannual_revenue,
            'yearly': yearly_revenue,
            'total': total_revenue,
            'currency': 'EUR'
        },
        'new_subscriptions_this_month': new_subscriptions_this_month,
        'timestamp': now.isoformat(),
        'status': 'success'
    })