from django.shortcuts import render
from django.db.models import Q
from django.http import HttpResponseRedirect, JsonResponse
from sales.models import *
from company.models import *
from masters.models import *
from common.utils import *

def sales_tax_report(request):
    if 'user_id' in request.session:
        user_type = request.session.get('user_type')
        branch_id = request.session.get('branch_id')
        role_id = request.session.get('role_id') 
        
        customers = selectList(customer_table, order_by='name')
        company = select_row(company_table, {'id': 1})
        
        return render(request, 'sales_tax_report.html', {'company': company, 'customers': customers})
    else:
        return HttpResponseRedirect("/")

def ajax_sales_tax_report_view(request):
    role_id = request.session.get('role_id')
    branch_id = request.session.get('branch_id')
    fyf_name = request.session.get('fyf')
    financial_year = calculate_financial_year(fyf_name)

    has_access, error_message = check_user_access(role_id, 'sales_tax_report', "read")
    if not has_access:
        return JsonResponse({
            'message': 'permission',
            'error_message': 'You do not have permission to view sales tax report details'
        })

    customer_id = request.POST.get('customer')
    from_date = request.POST.get('from_date')
    to_date = request.POST.get('to_date')
    keyword = request.POST.get('keyword_search', '').strip()

    # -----------------------------
    # 1️⃣ Sales Filter
    # -----------------------------
    query = Q(status=1, branch_id=branch_id, current_fy=financial_year)

    if customer_id:
        query &= Q(customer_id=customer_id)

    if from_date and to_date:
        query &= Q(inv_date__range=[from_date, to_date])

    if keyword:
        query &= Q(inv_no__icontains=keyword)

    sales_qs = sales_order_table.objects.filter(query).values(
        'id', 'inv_no', 'inv_date', 'time',
        'customer_id', 'customer_name', 'customer_phone'
    )

    sales_ids = [s['id'] for s in sales_qs]
    if not sales_ids:
        return JsonResponse({'data': []})

    sales_map = {s['id']: s for s in sales_qs}

    # Fetch Item SKU Mapping
    item_qs = item_table.objects.filter(
        status=1,
        is_active=1
    ).values(
        'sub_category_id',
        'brand_id',
        'model_id',
        'variant_id',
        'color_id',
        'sku_text',
        'hsn_code'
    )

    item_map = {
        (
            i['sub_category_id'],
            i['brand_id'],
            i['model_id'],
            i['variant_id'],
            i['color_id']
        ): (i['sku_text'], i['hsn_code'])
        for i in item_qs
    }

    # -----------------------------
    # 2️⃣ Child Sales Rows
    # -----------------------------
    child_qs = child_sales_order_table.objects.filter(
        status=1,
        branch_id=branch_id,
        current_fy=financial_year,
        tm_sales_id__in=sales_ids
    ).values()

    formatted = []
    
    # Pre-fetch Master Lists for loop efficiency lookup
    # Actually getItemNameById does a query every time unless cached or we pre-fetch.
    # common.utils.getItemNameById might be slow if called in loop.
    # For now, I'll follow purchase_report pattern (calling getItemNameById). 
    # If performance is an issue, we can optimize later.
    
    for index, item in enumerate(child_qs):
        sale = sales_map.get(item['tm_sales_id'])
        
        sku_key = (
            item.get('subcategory_id'),
            item.get('brand_id'),
            item.get('model_id'),
            item.get('variant_id'),
            item.get('color_id')
        )

        sku, hsn_code = item_map.get(sku_key, ('-', '-'))

        formatted.append({
            'id': index + 1,
            'inv_no': (
                f"<a href='javascript:void(0);' "
                f"class='text-primary' "
                f"onclick='sales_data({item['tm_sales_id']})'>"
                f"{sale['inv_no']}</a>"
                if sale['inv_no'] else '-'
            ),
            'inv_date': format_date_month_year(sale['inv_date']) + ' ' + format_hr_m(sale['time']) if sale['inv_date'] else '-',
            'customer': sale['customer_name'] or '-',
            'customer_phone': sale['customer_phone'] or '-',
            
            'sku': sku,
            'ean': item['ean_number'] or '-',
            'hsn_code': hsn_code,
            'subcategory': getItemNameById(sub_category_table, item['subcategory_id']) if item['subcategory_id'] else '-',
            'brand': getItemNameById(brand_table, item['brand_id']) if item['brand_id'] else '-',
            'model': getItemNameById(model_table, item['model_id']) if item['model_id'] else '-',
            'variant': getItemNameById(variant_table, item['variant_id']) if item['variant_id'] else '-',
            'color': getItemNameById(color_table, item['color_id']) if item['color_id'] else '-',

            'imei': item['imei_no'] or '-',
            'quantity': item['quantity'],
            'taxable_value': format_amount(item['rate']),
            'discount': format_amount(item['discount_amount']),
            'cgst': format_amount(item['tax_cgst']),
            'sgst': format_amount(item['tax_sgst']),
            'igst': format_amount(0),
            
            'total_tax': format_amount(item['tax_amount']),
            'total': format_amount(item['amount']),
        })

    return JsonResponse({'data': formatted})
