from django.shortcuts import render

# Create your views here.
from django.shortcuts import render
import json
from django.conf import settings
from django.shortcuts import render
from common.models import *
from masters.models import *
from masters.forms import *
from privilege.models import *
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
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,JsonResponse,HttpResponseRedirect
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.models.functions import Cast
from scheme.models import *
from scheme.forms import *
from supplier.models import supplier_table
from sales.models import child_sales_order_table
# ********************************************************************************************************************

def scheme(request):
    if 'user_id' in request.session:
        user_type = request.session.get('user_type')
        is_ho = request.session.get('is_ho')
        if user_type == 'stores':
            cmpy = select_row(company_table, {'id':1})
            category = selectList(category_table, order_by='name')
            sub_category = selectList(sub_category_table, order_by='name')
            uom = selectList(uom_table, order_by='name')
            variant = selectList(variant_table, order_by='name')
            model = selectList(model_table, order_by='name')
            tax = selectList(tax_table, order_by='name')
            brand = selectList(brand_table, order_by='name')
            color = selectList(color_table, order_by='name')
            if is_ho == 1:
                supplier = selectList(supplier_table, order_by='name')
            else:
                supplier = selectList(supplier_table, {'is_global':1}, order_by='name')
            return render(request, 'scheme.html', {'company': cmpy,'category':category,'sub_category':sub_category,'uom':uom,'brand':brand,'tax':tax,'variant':variant, 'model':model,'color':color,'supplier':supplier})
        else:
            return HttpResponseRedirect("/")
    else:
        return HttpResponseRedirect("/")

# ********************************************************************************************************************

def ajax_scheme_view(request):  
    role_id = request.session.get('role_id')
    has_access, error_message = check_user_access(role_id, 'scheme_upgrade', "read")
    if not has_access:
        return JsonResponse({'message': 'permission', 'error_message': 'You do not have permission to view Scheme/Upgrade details'})
    
    
    scheme_type = request.POST.get('scheme_type')
    brand_id = request.POST.get('brand_id')
    model_id = request.POST.get('model_id')
    variant_id = request.POST.get('variant_id')
 
    query = Q(status=1)

    if scheme_type:
        query &= Q(scheme_type=scheme_type)
    if brand_id:
        query &= Q(brand_id=brand_id)
    if model_id:
        query &= Q(model_id=model_id)
    if variant_id:
        query &= Q(variant_id=variant_id)
    


    data = list(selectList(item_scheme_table, query).values())
    formatted = [
        {
            'id': index + 1,
            'action': '<button type="button" onclick="edit_data(\'{}\')" class="btn btn-outline-success btn-xs p-1"><i class="fas fa-edit"></i></button> \
                      <button type="button" onclick="delete_data(\'{}\')" class="btn btn-outline-danger btn-xs p-1"> <i class="fas fa-trash-alt"></i></button>'.format(item['id'], item['id']), 
            'from_date': format_date_month_year(item['from_date']) if item['from_date'] else '-', 
            'to_date': format_date_month_year(item['to_date']) if item['to_date'] else '-', 
            'supplier':getItemNameById(supplier_table, item['supplier_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']),
            'scheme_type': format_badge(item['scheme_type'], mapping={
                'upgrade': 'badge text-bg-success',
                'special': 'badge text-bg-info'
            }, label_mapping={
                'upgrade': 'Upgrade',
                'special': 'Special'
            }),
            'ppd_mop': format_amount(item['mop_drop']) if item['mop_drop'] else '-', 
            'drop_percent': item['mop_drop_percent'] if item['mop_drop_percent'] else '-', 
            'after_drop': format_amount(item['mop_after_drop']) if item['mop_after_drop'] else '-', 
            'ppd_bop': format_amount(item['bop_drop']) if item['bop_drop'] else '-', 
            'description': item['description'] if item['description'] else '-',
            'status': format_badge(item['claim_status'], mapping={
                'pending': 'badge text-bg-info',
                'claimed': 'badge text-bg-success',
                'partial': 'badge text-bg-warning'
            }, label_mapping={
                'pending': 'Pending',
                'claimed': 'Claimed',
                'partial': 'Partial'
            }), # Assuming is_active is a boolean field

        } 
        for index, item in enumerate(data)
    ]
    return JsonResponse({'data': formatted})




def scheme_add(request):
    if request.method == 'POST':
        try:
            user_id = request.session.get('user_id')           
            branch_id = request.session.get('branch_id')           
            company_id = request.session.get('company_id')           
            role_id = request.session.get('role_id')
            has_access,error_message = check_user_access(role_id, 'scheme_upgrade', "create")
            fyf_name = request.session.get('fyf')
            financial_year = calculate_financial_year(fyf_name)
            
            date_times = timezone.localtime(timezone.now())
            if not has_access:
                return JsonResponse({'message': 'permission', 'error_message': 'You do not have permission to add Scheme/Upgrade details'})
            
            form = SchemeForm(request.POST, request.FILES)
            if form.is_valid():
                category = form.save(commit=False)
                scheme_no = generate_serial_number(
                    model                 = item_scheme_table,
                    number_field          ='scheme_no',
                    financial_year_field  ='current_fy',
                    financial_year        = financial_year,
                    branch_id             = branch_id,
                    prefix                ="SC-"
                )
                category.scheme_no = scheme_no
                category.subcategory_id = request.POST.get('subcategory_id') or 0
                category.supplier_id = request.POST.get('supplier_id') or 0
                category.brand_id = request.POST.get('brand_id') or 0
                category.model_id = request.POST.get('model_id') or 0
                category.variant_id = request.POST.get('variant_id') or 0
                category.scheme_type = request.POST.get('scheme_type')
                category.from_date = parse_date(request.POST.get('from_date'))
                category.to_date = parse_date(request.POST.get('to_date'))
                category.name = request.POST.get('name') or None                
                category.mop_drop = request.POST.get('mop_drop') or 0
                category.mop_drop_percent = request.POST.get('drop_percent') or 0
                category.mop_after_drop = request.POST.get('mop_after_drop') or 0
                category.bop_drop = request.POST.get('bop_drop') or 0      
                category.branch_id = branch_id         
                
                category.description = request.POST.get('description')
                category.company_id = company_id
                category.current_fy = financial_year
                category.date_time = format_datetime(date_times)
                category.is_active = 1
                category.status = 1
                category.created_by = user_id
                category.updated_by = user_id
                category.created_on = format_datetime(date_time)
                category.updated_on = format_datetime(date_time)
                category.save()
                return JsonResponse({'message': 'success'})
            else:
                errors = form.errors.as_json()
                return JsonResponse({'message': 'form_error', 'errors': errors}, status=400)

        except Exception as e:
            return JsonResponse({'message': 'exception', 'error': str(e)}, status=500)


def scheme_edit(request):
    if request.headers.get('x-requested-with') == 'XMLHttpRequest' and request.method == "POST":
        data = item_scheme_table.objects.filter(id=request.POST.get('id'))    
    return JsonResponse(data.values()[0])




def scheme_update(request):
    if request.method == "POST":
        try:
            category_id = request.POST.get('edit_id')
            category = item_scheme_table.objects.get(id=category_id)
            role_id = request.session.get('role_id')
            has_access = check_user_access(role_id, 'scheme_upgrade', "update")

            if not has_access:
                return JsonResponse({'message': 'permission', 'error_message': 'You do not have permission to update Scheme/Upgrade details'})
            
            
            form = SchemeForm(request.POST, request.FILES, instance=category)
            if form.is_valid():
                updated_category = form.save(commit=False)
                brand_id = request.POST.get('brand_id') or 0
                subcategory_id = request.POST.get('subcategory_id') or 0
                model_id = request.POST.get('model_id') or 0
                variant_id = request.POST.get('variant_id') or 0
                supplier_id = request.POST.get('supplier_id') or 0
                scheme_type = request.POST.get('scheme_type')
                from_date = parse_date(request.POST.get('from_date'))
                to_date = parse_date(request.POST.get('to_date'))
                desc = request.POST.get('description')
                name = request.POST.get('name')
              
                mop_drop = request.POST.get('mop_drop') or 0
                drop_percent = request.POST.get('drop_percent') or 0.00
                mop_after_drop = request.POST.get('mop_after_drop') or 0.00
                bop_drop = float(request.POST.get('bop_drop')) or 0.00

                is_active = request.POST.get('is_active')

                updated_category.brand_id = brand_id   
                updated_category.supplier_id = supplier_id         
                updated_category.subcategory_id = subcategory_id         
                updated_category.model_id = model_id
                updated_category.variant_id = variant_id            
                updated_category.scheme_type = scheme_type
                updated_category.from_date = from_date
                updated_category.to_date = to_date
                updated_category.name = name
                updated_category.mop_drop = mop_drop
                updated_category.mop_drop_percent = drop_percent
                updated_category.mop_after_drop = mop_after_drop
                updated_category.bop_drop = bop_drop
                updated_category.is_active = is_active            
                updated_category.description = desc
                updated_category.updated_by = request.session.get('user_id')
                updated_category.updated_on = format_datetime(date_time)
                updated_category.save()
                return JsonResponse({'message': 'success'})
            else:
                errors = form.errors.as_json()
                return JsonResponse({'message': 'error', 'errors': errors})
        except Exception as e:
            return JsonResponse({'message': 'exception', 'error': str(e)})




def scheme_delete(request):
    if request.method == 'POST':
        data_id = request.POST.get('id')    
        role_id = request.session.get('role_id')
        has_access, error_message = check_user_access(role_id, 'scheme_upgrade', "delete")

        if not has_access:
            return JsonResponse({'message': 'permission', 'error_message': 'You do not have permission to delete Scheme/Upgrade details'})
               
        try:
            # 1. Retrieve the scheme and its type
            scheme_obj = item_scheme_table.objects.get(id=data_id)
            scheme_type = scheme_obj.scheme_type

            # 2. Check if scheme is used in any sales order
            is_used = False
            if scheme_type == 'special':
                is_used = child_sales_order_table.objects.filter(special_id=data_id, status=1).exists()
            elif scheme_type == 'upgrade':
                is_used = child_sales_order_table.objects.filter(upgrade_id=data_id, status=1).exists()

            if is_used:
                return JsonResponse({
                    'message': 'warning', 
                    'error_message': 'You cannot delete this scheme because it is already used in a sales order.'
                })

            # 3. Perform hard delete (record removed from database)
            scheme_obj.delete()
            return JsonResponse({'message': 'yes'})

        except item_scheme_table.DoesNotExist:
            return JsonResponse({'message': 'no such data'})
        except Exception as e:
            return JsonResponse({'message': 'exception', 'error': str(e)})

    return JsonResponse({'message': 'Invalid request method'})

