from django.shortcuts import render
import json
from django.conf import settings
from expenses.models import *
from store.models import *
from masters.models import *
from financial_year.models import *
from sales.models import *
from customer.models import *
from employee.models import *
from stock.models import *
from inventory.models import *
from reports.report_utils import get_imei_stock_summary_data
from datetime import datetime, timedelta
from django.db.models import Sum, Count, F, Q
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from common.utils import *
from common.views import get_current_balance
from .admin_dashboard import get_admin_dashboard_data


def _render_admin_dashboard(request):
    company = select_row(company_table, {'id': 1})
    admin_data = get_admin_dashboard_data(request)
    context = {
        'company': company,
        **admin_data
    }
    return render(request, 'admin_dashboard.html', context)


def _render_wholesale_dashboard(request):
    user_type = request.session.get('user_type')
    if user_type == 'wholesale_customer':
        from wholesale.external import wholesale_dashboard as external_wholesale_dashboard
        return external_wholesale_dashboard(request)
    return render(request, 'wholesale_dashboard.html')


def _render_store_dashboard(request, user_id, branch_id):
    period = request.GET.get('period', 'today')
    today = datetime.now().date()
    start_date = today
    end_date = today

    if period == 'yesterday':
        start_date = today - timedelta(days=1)
        end_date = start_date
    elif period == 'last_7_days':
        start_date = today - timedelta(days=7)
    elif period == 'this_month':
        start_date = today.replace(day=1)
    elif period == 'last_month':
        last_month_end = today.replace(day=1) - timedelta(days=1)
        start_date = last_month_end.replace(day=1)
        end_date = last_month_end
    elif period == 'this_year':
        start_date = today.replace(month=1, day=1)
    elif period == 'all':
        start_date = datetime(2000, 1, 1).date()

    sales_filter = Q(branch_id=branch_id, inv_date__range=[start_date, end_date], status=1, is_active=1)
    purchase_filter = Q(branch_id=branch_id, pu_date__range=[start_date, end_date], status=1, is_active=1)
    expense_filter = Q(branch_id=branch_id, date__range=[start_date, end_date], status=1, is_active=1)
    customer_filter = Q(branch_id=branch_id, created_on__date__range=[start_date, end_date], status=1, is_active=1)

    sales_data = sales_order_table.objects.filter(sales_filter).aggregate(
        total_amt=Sum('total_amount'),
        total_count=Count('id')
    )
    total_sales = sales_data['total_amt'] or 0
    total_orders = sales_data['total_count'] or 0

    purchase_data = purchase_inward_table.objects.filter(purchase_filter).aggregate(
        total_amt=Sum('grand_total'),
        purchase_count=Count('id')
    )
    total_purchase = purchase_data['total_amt'] or 0
    purchase_orders = purchase_data['purchase_count'] or 0

    total_expenses = expense_table.objects.filter(expense_filter).aggregate(
        total_amt=Sum('amount')
    )['total_amt'] or 0

    available_stock_count, _ = get_imei_stock_summary_data(branch_id, 0, {})
    new_customers = customer_table.objects.filter(customer_filter).count()

    balance_data = get_current_balance(branch_id, calculate_financial_year(request.session.get('fyf')))
    current_cash = balance_data.get('current_balance', 0)

    branch = branch_table.objects.get(id=branch_id)
    employee = employee_table.objects.get(id=user_id)

    current_datetime = datetime.now()
    hour = current_datetime.hour
    if hour < 12:
        greeting = "Good Morning"
    elif hour < 17:
        greeting = "Good Afternoon"
    else:
        greeting = "Good Evening"

    company = select_row(company_table, {'id': 1})

    context = {
        'company': company,
        'branch': branch,
        'employee': employee,
        'current_date': current_datetime.date(),
        'current_time': current_datetime.strftime("%I:%M %p"),
        'greeting': greeting,
        'period': period,
        'total_sales': total_sales,
        'total_purchase': total_purchase,
        'purchase_orders': purchase_orders,
        'total_expenses': total_expenses,
        'total_orders': total_orders,
        'available_stock': available_stock_count,
        'new_customers': new_customers,
        'current_cash': current_cash,
    }

    if request.GET.get('ajax') == '1':
        return JsonResponse({
            'total_sales': f"\u20b9{total_sales:,.0f}",
            'total_purchase': f"\u20b9{total_purchase:,.0f}",
            'purchase_orders': purchase_orders,
            'total_expenses': f"\u20b9{total_expenses:,.0f}",
            'total_orders': total_orders,
            'available_stock': available_stock_count,
            'new_customers': new_customers,
            'current_time': current_datetime.strftime("%I:%M %p"),
        })

    return render(request, 'store_dashboard.html', context)


def branch_wise_performance(request):
    if 'user_id' not in request.session:
        return HttpResponseRedirect("/")

    user_type = request.session.get('user_type')
    if user_type != 'admin':
        return HttpResponseRedirect("/")

    company = select_row(company_table, {'id': 1})
    admin_data = get_admin_dashboard_data(request)
    context = {
        'company': company,
        **admin_data
    }
    return render(request, 'branch_report.html', context)


def dashboard(request):
    if 'user_id' not in request.session:
        return HttpResponseRedirect("/")

    user_id = request.session.get('user_id')
    user_type = request.session.get('user_type')
    branch_id = request.session.get('branch_id')

    if user_type == 'admin':
        return _render_admin_dashboard(request)

    if user_type == 'wholesale':
        return _render_wholesale_dashboard(request)

    if user_type == 'stores' and branch_id:
        return _render_store_dashboard(request, user_id, branch_id)

    return HttpResponseRedirect("/")
