from django.shortcuts import render, get_object_or_404, redirect
from django.core.management import call_command
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .models import EmailMessage, EmailAccount, Client, Invoice, Website
from django.db.models import Q, Sum, Avg, Count
from django.http import HttpResponse, JsonResponse
import sys

def get_base_context():
    try:
        accounts = EmailAccount.objects.all()
        new_emails_count = EmailMessage.objects.filter(status='new').count()
        total_spent = Client.objects.aggregate(Sum('total_spent'))['total_spent__sum'] or 0
        return {
            'accounts': accounts,
            'new_emails_count': new_emails_count,
            'stats': {
                'new': new_emails_count,
                'total_revenue': total_spent,
                'clients': Client.objects.count()
            }
        }
    except Exception as e:
        # إذا حدث خطأ في قاعدة البيانات (جداول مفقودة مثلاً)
        return {
            'accounts': [],
            'new_emails_count': 0,
            'stats': {'new': 0, 'total_revenue': 0, 'clients': 0},
            'db_error': str(e)
        }

@login_required(login_url='/login/')
def dashboard(request):
    try:
        context = get_base_context()
        q = request.GET.get('q', '')
        account_id = request.GET.get('account', '')
        emails = EmailMessage.objects.all().order_by('-received_at')
        if q:
            emails = emails.filter(Q(subject__icontains=q) | Q(sender_email__icontains=q) | Q(body_text__icontains=q))
        if account_id:
            emails = emails.filter(account_id=account_id)
        context.update({'emails': emails, 'q': q, 'current_account': account_id})
        return render(request, 'dashboard.html', context)
    except Exception as e:
        return HttpResponse(f"Dashboard Error: {str(e)}")

@login_required(login_url='/login/')
def clients_list(request):
    try:
        context = get_base_context()
        status_filter = request.GET.get('status', 'all')
        clients = Client.objects.all()
        if status_filter == 'vip': clients = clients.filter(status='vip')
        elif status_filter == 'active': clients = clients.filter(status='active')
        elif status_filter == 'reseller': clients = clients.filter(status='reseller')
        else: clients = clients.exclude(status='spam')
        context.update({'clients': clients.order_by('-created_at'), 'current_status': status_filter})
        return render(request, 'clients.html', context)
    except Exception as e:
        return HttpResponse(f"Clients Error: {str(e)}")

@login_required(login_url='/login/')
def client_profile(request, client_id):
    try:
        context = get_base_context()
        client = get_object_or_404(Client, id=client_id)
        emails = client.emails.all().order_by('-received_at')
        websites_all = Website.objects.filter(is_active=True) if Website.objects.exists() else []
        context.update({'client': client, 'emails': emails, 'websites_all': websites_all})
        return render(request, 'client_profile.html', context)
    except Exception as e:
        return HttpResponse(f"Profile Error: {str(e)}")

@login_required(login_url='/login/')
def accounts_list(request):
    try:
        context = get_base_context()
        # نرسل context فارغ في البداية للتأكد من أن الخطأ ليس من get_base_context
        return render(request, 'accounts.html', context)
    except Exception as e:
        return HttpResponse(f"Accounts List Error: {str(e)}")

@login_required(login_url='/login/')
def financial_report(request):
    try:
        context = get_base_context()
        return render(request, 'financial_report.html', context)
    except Exception as e:
        return HttpResponse(f"Finance Error: {str(e)}")

@login_required(login_url='/login/')
def websites_list(request):
    try:
        context = get_base_context()
        websites = Website.objects.all()
        context.update({'websites': websites})
        return render(request, 'websites_list.html', context)
    except Exception as e:
        return HttpResponse(f"Websites Error: {str(e)}")

@login_required(login_url='/login/')
def read_email(request, email_id):
    try:
        context = get_base_context()
        email_obj = get_object_or_404(EmailMessage, id=email_id)
        context.update({'email': email_obj})
        return render(request, 'read_email.html', context)
    except Exception as e:
        return HttpResponse(f"Read Email Error: {str(e)}")

# باقي الدوال الأساسية
@login_required(login_url='/login/')
def reply_email(request, email_id): return redirect('read_email', email_id=email_id)

@login_required(login_url='/login/')
def add_account(request):
    if request.method == "POST":
        try:
            EmailAccount.objects.create(
                name=request.POST.get('name'), email_address=request.POST.get('email_address'),
                password=request.POST.get('password'), imap_server=request.POST.get('imap_server'),
                smtp_server=request.POST.get('smtp_server')
            )
            messages.success(request, 'تم الإضافة!')
        except Exception as e:
            messages.error(request, f'خطأ: {str(e)}')
    return redirect('accounts_list')

@login_required(login_url='/login/')
def manual_fetch(request):
    call_command('fetch_emails')
    messages.success(request, 'تم جلب الرسائل!')
    return redirect('dashboard')

@login_required(login_url='/login/')
def check_new_emails(request):
    return JsonResponse({'new_count': EmailMessage.objects.filter(status='new').count()})

def run_migrations_secret(request):
    try:
        call_command('makemigrations', 'mail_app')
        call_command('migrate', 'mail_app')
        return HttpResponse('<h1>تم تحديث قاعدة البيانات بنجاح!</h1><a href="/">العودة للرئيسية</a>')
    except Exception as e:
        return HttpResponse(f'<h1>خطأ أثناء التحديث</h1><p>{str(e)}</p>')

@login_required(login_url='/login/')
def create_invoice(request, client_id):
    # دالة بسيطة لإنشاء فاتورة
    return redirect('client_profile', client_id=client_id)

@login_required(login_url='/login/')
def edit_client(request, client_id):
    # دالة بسيطة للتعديل
    return redirect('client_profile', client_id=client_id)
