from django.shortcuts import render
from django.http import JsonResponse
from django.db.models import Q
from inventory.models import *
from sales.models import *
from material.models import *
from stock.models import *
from masters.models import *
from common.utils import selectList, getItemNameById, format_amount, calculate_financial_year, check_user_access, format_date_month_year
from store.models import *
from scheme.models import *
from django.http import HttpResponseRedirect
from supplier.models import *
from common.utils import *
# ***************************************************************************************************************************

def special_scheme(request):
    if 'user_id' in request.session:
        user_type = request.session.get('user_type')
        branch_id = request.session.get('branch_id')
        is_ho = request.session.get('is_ho')

        if is_ho == 1:
            branches = branch_table.objects.filter(status=1).order_by('name')
        else:
            branches = branch_table.objects.filter(status=1, id=branch_id).order_by('name')

        return render(request, 'special_scheme.html', {'branches': branches})
    else:
        return HttpResponseRedirect("/")

def ajax_special_scheme_report(request):
    role_id = request.session.get('role_id')
    branch_id = request.session.get('branch_id')
    is_ho = request.session.get('is_ho')
    fyf_name = request.session.get('fyf')
    financial_year = calculate_financial_year(fyf_name)
    
   
    has_access, error_message = check_user_access(role_id, 'special_scheme_report', "read")
    if not has_access:
        return JsonResponse({'message': 'permission', 'error_message': 'You do not have permission to view this report'})

    # Get filter parameters
    from_date = request.POST.get('from_date')
    to_date = request.POST.get('to_date')
    selected_branch_id = request.POST.get('branch_id')

    # Query tx_sales for special schemes
    query = Q(status=1) & Q(special_id__gt=0)
    
    if is_ho == 0 or is_ho == '0':
        query &= Q(branch_id=branch_id)

    elif selected_branch_id:
        query &= Q(branch_id=selected_branch_id)

    # Join with tm_sales for date filter
    sales_ids = []
    if from_date and to_date:
        tm_sales_qs = sales_order_table.objects.filter(
            status=1,
            inv_date__range=[from_date, to_date]
        ).values_list('id', flat=True)
        query &= Q(tm_sales_id__in=tm_sales_qs)

    sales_items = child_sales_order_table.objects.filter(query).values(
        'id', 'tm_sales_id', 'branch_id', 'imei_no', 'item_id', 'special_id', 'special_amount',
        'subcategory_id', 'brand_id', 'model_id', 'variant_id', 'mop'
    )

    # Get item names/SKUs
    item_ids = [item['item_id'] for item in sales_items]
    items = item_table.objects.filter(id__in=item_ids).values('id', 'sku_text')
    item_map = {i['id']: i['sku_text'] for i in items}

    scheme_ids = [item['special_id'] for item in sales_items]
    schemes = item_scheme_table.objects.filter(id__in=scheme_ids).values('id', 'mop_after_drop', 'mop_drop')
    scheme_map = {s['id']: s for s in schemes}

    branch_ids = [item['branch_id'] for item in sales_items]
    branches = branch_table.objects.filter(id__in=branch_ids).values('id', 'name')
    branch_map = {b['id']: b['name'] for b in branches}

    formatted_data = []
    for idx, item in enumerate(sales_items):
        scheme = scheme_map.get(item['special_id'], {})
        
        return_cr = 0
        return_item = child_sales_return_table.objects.filter(
            status=1,
            sales_id=item['tm_sales_id'],
            imei_no=item['imei_no']
        ).first()

        if return_item:
            return_cr = return_item.special_amount or 0
        sku = select_row(item_table, {'sub_category_id':item['subcategory_id'], 'brand_id':item['brand_id'], 'model_id':item['model_id'], 'variant_id':item['variant_id']})
        formatted_data.append({
            'sl_no': idx + 1,
            'branch': branch_map.get(item['branch_id'], '-'),
            'subcategory':getItemNameById(sub_category_table, item['subcategory_id']),
            'brand':getItemNameById(brand_table, item['brand_id']),
            'model':getItemNameById(model_table, item['model_id']),
            'variant':getItemNameById(variant_table, item['variant_id']),
            'color':getItemNameById(color_table, item['variant_id']),
            'imei': item['imei_no'] if item['imei_no'] else '-',
            'sku': sku.sku_text if sku else '-',
            'mop': format_amount(item['mop']),
            'scheme_amount': format_amount(item['special_amount']),
            'cr': format_amount(scheme.get('mop_after_drop', 0)),
            'return_cr': format_amount(return_cr)
        })

    return JsonResponse({'data': formatted_data})
