from django.shortcuts import render
import json
from django.conf import settings
from django.shortcuts import render
from inventory.models import *
from expenses.models import *
from store.models import *
from company.models import *
from masters.models import *
from supplier.models import *
from django.db import IntegrityError, transaction
import hashlib
import os
from django.conf import settings
from datetime import datetime
from django.utils import timezone
from django.db.models import Max, F, Q,Sum
import base64
from django.shortcuts import render
from io import BytesIO
from django.conf import settings
from django.template.loader import get_template
from django.http import HttpResponse,HttpResponseRedirect,JsonResponse,FileResponse
from django.shortcuts import get_object_or_404
from django.templatetags.static import static
from xhtml2pdf import pisa
from num2words import num2words
from django.contrib.staticfiles import finders  
from common.utils import *
from django.db import connection
import openpyxl
from openpyxl.styles import Font
from django.http import HttpResponse
from django.core.files.storage import default_storage
from sales.models import *
from scheme.models import *
# *********************************************************************************************************************************


def purchase_tax_report(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 user_type == 'stores':
            company = select_row(company_table, {'id': 1})  
            category = selectList(category_table, order_by='name')
            if is_ho == 1:
                supplier = selectList(supplier_table, order_by='name' )
            else:
                supplier = selectList(supplier_table, Q(is_global=1), order_by='name' )
   
            branch = selectList(branch_table, order_by='name').exclude(id=branch_id)
            return render(request, 'purchase_tax_report.html', {'company': company,'category':category,'supplier':supplier,'branch':branch})
        else:
            return HttpResponseRedirect("/")
    else:
        return HttpResponseRedirect("/")

def ajax_purchase_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, 'purchase_tax_report', "read")
    if not has_access:
        return JsonResponse({
            'message': 'permission',
            'error_message': 'You do not have permission to view purchase tax report details'
        })

    supplier_id = request.POST.get('supplier')
    from_date = request.POST.get('from_date')
    to_date = request.POST.get('to_date')
    keyword = request.POST.get('keyword_search', '').strip()

    # -----------------------------
    # 1️⃣ Purchase inward filter
    # -----------------------------
    query = Q(status=1, branch_id=branch_id, current_fy=financial_year)

    if supplier_id:
        query &= Q(supplier_id=supplier_id)

    if from_date and to_date:
        query &= Q(pu_date__range=[from_date, to_date])

    if keyword:
        query &= Q(pu_no__icontains=keyword)

    purchase_qs = purchase_inward_table.objects.filter(query).values(
        'id', 'pu_no', 'pu_date', 'time',
        'supplier_id', 'supplier_no', 'supplier_date'
    )

    purchase_ids = [p['id'] for p in purchase_qs]
    if not purchase_ids:
        return JsonResponse({'data': []})

    purchase_map = {p['id']: p for p in purchase_qs}
    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'
    )

    item_map = {
        (
            i['sub_category_id'],
            i['brand_id'],
            i['model_id'],
            i['variant_id'],
            i['color_id']
        ): i['sku_text']
        for i in item_qs
    }


    # -----------------------------
    # 2️⃣ Child purchase rows
    # -----------------------------
    child_qs = child_purchase_inward_table.objects.filter(
        status=1,
        branch_id=branch_id,
        current_fy=financial_year,
        tm_pu_id__in=purchase_ids
    ).values()
    


    formatted = []
    for index, item in enumerate(child_qs):
        purchase = purchase_map.get(item['tm_pu_id'])
        sku_key = (
            item.get('subcategory_id'),
            item.get('brand_id'),
            item.get('model_id'),
            item.get('variant_id'),
            item.get('color_id')
        )

        sku = item_map.get(sku_key, '-')
        supplier = select_row(supplier_table, {'id': purchase['supplier_id']})

        formatted.append({
            'id': index + 1,
            'inv_no': (
                f"<a href='javascript:void(0);' "
                f"class='text-primary' "
                f"onclick='purchase_data({item['tm_pu_id']})'>"
                f"{purchase['pu_no']}</a>"
                if purchase['pu_no'] else '-'
            ),
            'inv_date': format_date_month_year(purchase['pu_date']) + ' ' + format_hr_m(purchase['time']) if purchase['pu_date'] else '-',
            'supplier': getItemNameById(supplier_table, purchase['supplier_id']) if purchase['supplier_id'] else '-',
            'supplier_gst_no': supplier.gstin or '-',
            'supplier_no': purchase['supplier_no'] or '-',
            'supplier_date': format_date_month_year(purchase['supplier_date']) if purchase['supplier_date'] else '-',

            'sku': sku,
            'ean': item['ean'] or '-',
            'hsn_code': item['hsn_code'] or '-',
            '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(item['tax_igst']),
            'total_tax': format_amount(item['tax_amount']),
            'total': format_amount(item['amount']),
        })

    return JsonResponse({'data': formatted})
