from django.shortcuts import render
import json
from django.conf import settings
from django.shortcuts import render
from sales.models import *
from expenses.models import *
from store.models import *
from masters.models import *
from stock.models import *
from material.models import *
from employee.models import *

from collections import defaultdict
from sales.forms 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
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.views.decorators.csrf import csrf_exempt
from supplier.models import *
from django.db import connection
from customer.models import *
from django.db import transaction as db_transaction
from scheme.models import *
#```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````

def sales_request(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':
            branch = selectList(branch_table,{'is_wholesale':1}, 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' )
            encoded_id = request.GET.get('id') or 0
            if encoded_id != 0:
                decoded_id = decode_base64_id(encoded_id) or 0
            else:
                decoded_id = 0

            return render(request, 'sales_request.html',{'supplier':supplier,'branch':branch,'decoded_id':decoded_id})
        else:
            return HttpResponseRedirect("/")
    else:
        return HttpResponseRedirect("/")
    

from wholesale.models import *

def ajax_sales_request(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_order', "read")

    if not has_access:
        return JsonResponse({'message': 'permission', 'error_message': 'You do not have permission to view Purchase Order details'})
    
    request_branch_id = request.POST.get('request_branch')
    from_date = request.POST.get('from_date')
    to_date = request.POST.get('to_date')
    keyword = request.POST.get('keyword_search', '').strip()

    query = Q(status=1, supply_branch_id=branch_id, current_fy = financial_year)

    
    if request_branch_id:
        query &= Q(branch_id=request_branch_id)


    if from_date and to_date:
        query &= Q(po_date__range=[from_date, to_date])

    if keyword:
        query &= Q(po_no__icontains=keyword)
       
    
    
    data = list(selectList(wholesale_po_table, query).values())

    formatted = []
    for index, item in enumerate(data):       
        po_status = (item.get('po_status') or '').lower()
        if po_status == 'pending':
            action_html = (
                '<button type="button" onclick="approve_data(\'{}\')" class="btn btn-outline-success btn-xs p-1 me-1" title="Approve">'
                '<i class="fas fa-check"></i></button>'
                '<button type="button" onclick="open_reject_modal(\'{}\')" class="btn btn-outline-danger btn-xs p-1 me-1" title="Reject">'
                '<i class="fas fa-times"></i></button>'
                '<button type="button" onclick="view_data(\'{}\')" class="btn btn-outline-primary btn-xs p-1" title="View">'
                '<i class="fas fa-eye"></i></button>'
            ).format(item['id'], item['id'], item['id'])
        elif po_status == 'rejected':
            action_html = (
                '<button type="button" onclick="show_rejection_info(\'{}\')" class="btn btn-outline-info btn-xs p-1 me-1" title="View Rejection Details">'
                '<i class="fas fa-info-circle"></i></button>'
                '<button type="button" onclick="view_data(\'{}\')" class="btn btn-outline-primary btn-xs p-1" title="View">'
                '<i class="fas fa-eye"></i></button>'
            ).format(item['id'], item['id'])
        elif po_status == 'declined':
            action_html = (
                '<button type="button" onclick="show_rejection_info(\'{}\')" class="btn btn-outline-info btn-xs p-1 me-1" title="View Rejection Details">'
                '<i class="fas fa-info-circle"></i></button>'
                '<button type="button" onclick="view_data(\'{}\')" class="btn btn-outline-primary btn-xs p-1" title="View">'
                '<i class="fas fa-eye"></i></button>'
            ).format(item['id'], item['id'])
        else:
            action_html = (
                '<button type="button" onclick="view_data(\'{}\')" class="btn btn-outline-primary btn-xs p-1" title="View">'
                '<i class="fas fa-eye"></i></button>'
            ).format(item['id'])

        formatted.append({
            'id': index + 1,
            'po_ref_id': item['id'],
            'action': action_html, 
            'po_no': item['po_no'] if item['po_no'] else '-', 
            'po_date': format_date_month_year(item['po_date']),
            'supply_branch': getItemNameById(branch_table, item['branch_id']) if item['branch_id'] else '-', 
            'quantity': item['total_quantity'] if item['total_quantity'] else '-', 
            'amount': format_amount(item['total_amount']),            
            'remarks': item['remarks'] if item['remarks'] else '-', 
            'rejected_by': getItemNameById(employee_table, item['updated_by']) if item.get('updated_by') else '-',
            'rejected_on': format_date_time_month_year(item['updated_on']) if item.get('updated_on') else '-',
            'rejected_remarks': item['remarks'] if item['remarks'] else '-',
            'status': format_badge(po_status, mapping={
                'pending': 'badge text-bg-info',
                'approved': 'badge text-bg-success',
                'declined': 'badge text-bg-danger',
                'accepted': 'badge text-bg-success',
                'rejected': 'badge text-bg-danger'
            }, label_mapping={
                'pending': 'Pending',
                'approved': 'Approved',
                'declined': 'Declined',
                'accepted': 'Accepted',
                'rejected': 'Rejected'
            })
        })


    return JsonResponse({'data': formatted})


def ajax_sales_request_view_details(request):
    po_id = request.POST.get('po_id')
    if not po_id:
        return JsonResponse({'data': []})

    items_qs = wholesale_tx_po_table.objects.filter(tm_po_id=po_id, status=1).values()
    formatted = []
    for index, item in enumerate(items_qs):
        formatted.append({
            'id': index + 1,
            'ean': item['ean'] 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 '-',
            'qty': item['quantity'] or 0,
            'rate': format_amount(item['rate']) if item['rate'] else format_amount(0),
            'amount': format_amount(item['amount']) if item['amount'] else format_amount(0),
        })
    return JsonResponse({'data': formatted})


def ajax_sales_request_accept(request):
    if request.method != 'POST':
        return JsonResponse({'message': 'error', 'error_message': 'Invalid request method'})

    po_id = request.POST.get('po_id')
    user_id = request.session.get('user_id')
    now = timezone.localtime(timezone.now())

    if not po_id:
        return JsonResponse({'message': 'warning', 'error_message': 'Invalid PO reference'})

    po_obj = wholesale_po_table.objects.filter(id=po_id, status=1).first()
    if not po_obj:
        return JsonResponse({'message': 'warning', 'error_message': 'PO not found'})
    if (po_obj.po_status or '').lower() != 'pending':
        return JsonResponse({'message': 'warning', 'error_message': 'Only pending Sales Request can be accepted'})

    po_obj.po_status = 'approved'
    po_obj.updated_by = user_id
    po_obj.updated_on = now
    po_obj.save(update_fields=['po_status', 'updated_by', 'updated_on'])

    return JsonResponse({'message': 'success', 'success_message': 'Sales Request accepted successfully'})


def ajax_sales_request_reject(request):
    if request.method != 'POST':
        return JsonResponse({'message': 'error', 'error_message': 'Invalid request method'})

    po_id = request.POST.get('po_id')
    reject_remarks = (request.POST.get('reject_remarks') or '').strip()
    user_id = request.session.get('user_id')
    now = timezone.localtime(timezone.now())

    if not po_id:
        return JsonResponse({'message': 'warning', 'error_message': 'Invalid PO reference'})

    if not reject_remarks:
        return JsonResponse({'message': 'warning', 'error_message': 'Reject remarks is required'})

    po_obj = wholesale_po_table.objects.filter(id=po_id, status=1).first()
    if not po_obj:
        return JsonResponse({'message': 'warning', 'error_message': 'PO not found'})
    if (po_obj.po_status or '').lower() != 'pending':
        return JsonResponse({'message': 'warning', 'error_message': 'Only pending Sales Request can be rejected'})

    po_obj.po_status = 'rejected'
    po_obj.rejected_remarks = reject_remarks
    po_obj.rejected_by = user_id
    po_obj.rejected_on = format_datetime(now)
    po_obj.updated_by = user_id
    po_obj.updated_on = now
    po_obj.save(update_fields=['po_status', 'remarks', 'updated_by', 'updated_on'])

    return JsonResponse({'message': 'success', 'success_message': 'Sales Request rejected successfully'})
