from django.views.generic import TemplateView
from django.http import HttpResponse
from django.conf import settings
from django.urls import resolve
from _keenthemes.__init__ import KTLayout
from _keenthemes.libs.theme import KTTheme
from pprint import pprint
from django.shortcuts import render,HttpResponse,redirect
from django.contrib.auth.decorators import login_required
from authentication.models import User
from myobconnect.models import MyobModel
from supplier.models import Supplier,Supplier_Invoice,Supplier_InvoiceItem,Supplier_Payment
import base64
from django.contrib import messages
import requests
import json
from myobconnect.views import refresh_token
from datetime import datetime
from decimal import Decimal
import re
from product.models import Product
from quotation.models import GST,Discount



def supplier_payment_check(request,id):

    refresh_token(request)
    
    myobdata = MyobModel.objects.first()
    if not myobdata:
        messages.error(request,'Please First create Access Code')
        return redirect('/myob/initiate-connection')
    supplier_invoice=Supplier_Invoice.objects.get(id=id)
    supplier_invoice_uid=supplier_invoice.uid
  
    api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Purchase/SupplierPayment"

   
    
    # payment_uid=supplier_payaments.uid
    
    headers = {
        'Authorization': f'Bearer {myobdata.access_token}',
        'x-myobapi-key': settings.MYOB_CLIENT_ID,
        'x-myobapi-version': 'v2',
        'Content-Type': 'application/json',
        'Accept-Encoding': 'gzip,deflate'
    }
    
    response = requests.get(api_url,headers=headers)

    if response.status_code == 200:
        myob_data=response.json()

        

        matching_supplier_payments = []
        for supplier_payment in myob_data["Items"]:
          

            lines = supplier_payment["Lines"]
          
            for line in lines:
      
                if line["Purchase"]["UID"] == supplier_invoice_uid:
                    
                    matching_supplier_payments.append(supplier_payment)

      



        for matching_payment in  matching_supplier_payments:
            print("Matching Supplier Payment:",matching_payment["UID"])

            supplier_payments=Supplier_Payment.objects.filter(uid=matching_payment["UID"])
            if not  supplier_payments.exists():

                supplier_payment=Supplier_Payment(

                    uid=matching_payment["UID"],
                    paid_amount= matching_payment["AmountPaid"],
                    pay_date=matching_payment["Date"],
                    supplier_invoice=supplier_invoice,
                    due_amount=abs(float(supplier_invoice.payable_amount)- matching_payment["AmountPaid"]),
                    payable_amount=abs(float(supplier_invoice.payable_amount)- matching_payment["AmountPaid"]),
                    
                )
                
                supplier_payment.save()


    
            #     for supplier_payament in supplier_payaments:
                  
                
            #         if payment_uid != matching_payment["UID"]:
            #             supplier_payment=Supplier_Payment(
            #                 uid=matching_payment["UID"],
            #                 paid_amount= matching_payment["AmountPaid"],
            #                 pay_date=matching_payment["Date"],
            #                 supplier_invoice=supplier_invoice,
            #                 due_amount=float(supplier_invoice.payable_amount)- matching_payment["AmountPaid"],
            #                 payable_amount=float(supplier_invoice.payable_amount)- matching_payment["AmountPaid"],
                          
            #             )
            #             supplier_payment.save()
            # else:
                   
                    # supplier_payment=Supplier_Payment(

                    #     uid=matching_payment["UID"],
                    #     paid_amount= matching_payment["AmountPaid"],
                    #     pay_date=matching_payment["Date"],
                    #     supplier_invoice=supplier_invoice,
                    #     due_amount=float(supplier_invoice.payable_amount)- matching_payment["AmountPaid"],
                    #     payable_amount=float(supplier_invoice.payable_amount)- matching_payment["AmountPaid"],
                        
                    # )
                    
                    # supplier_payment.save()
                
         
                       
    #     messages.success(request, 'Supplier Bill Pay Successfully.')
    #     return redirect('supplier:supplier_payment_list',supplier_invoice.id)
    # else:

    #     messages.success(request, 'Failed To Create Supplier Payment.')
    #     return redirect('supplier:supplier_payment_list',supplier_invoice.id)



  



@login_required
def supplier_payment(request,id):

    if request.method =='POST':


        refresh_token(request)
    
        myobdata = MyobModel.objects.first()
        if not myobdata:
            messages.error(request,'Please First create Access Code')
            return redirect('/myob/initiate-connection')

        api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Purchase/SupplierPayment"

        supplier_invoice=Supplier_Invoice.objects.get(id=id)

        paid_amount=float(request.POST.get('paid_amount'))
       

        # if paid_amount > supplier_invoice.payable_amount:
        #     messages.success(request, 'Pay Amount Cannot Exceed Payable Amount.')
        #     return  redirect('supplier:supplier_payment_list',supplier_invoice.id)
        
        payable_amount=float(supplier_invoice.payable_amount)-paid_amount
  

        supplier_bill=Supplier_Payment(
            supplier_invoice= supplier_invoice,
         
            payable_amount=abs(payable_amount),
            paid_amount=abs(paid_amount),
            due_amount=abs(payable_amount),
        )
        supplier_bill.save()
        supplier_invoice.payable_amount=payable_amount
        supplier_invoice.save()


        headers = {
            'Authorization': f'Bearer {myobdata.access_token}',
            'x-myobapi-key': settings.MYOB_CLIENT_ID,
            'x-myobapi-version': 'v2',
            'Content-Type': 'application/json',
            'Accept-Encoding': 'gzip,deflate'
        }

        supplier_payment=Supplier_Payment.objects.latest('id')


        supplierpayment=    {
            "PayFrom": "Account",
              "Account": {
                "UID": "bbcdb17b-8526-4fe1-9fbd-2e23c6c6b18e"
            },
            "Supplier": {
                "UID": supplier_invoice.supplier.myob_uid
            },
            "PayeeAddress": "My Tabs Pty Ltd",
            "StatementParticulars": "",
            "PaymentNumber": "1",
            "Date": supplier_payment.pay_date.strftime('%Y-%m-%dT%H:%M:%S'),
            "AmountPaid":float(supplier_payment.paid_amount),
            "Memo": "Payment; My Tabs Pty Ltd",
            "Lines": [
                {
                    "Type": "Bill",
                    "Purchase": {
                        "UID": supplier_invoice.uid
                    },
                    "AmountApplied": float(supplier_payment.paid_amount),
                }
            ],
            "DeliveryStatus": "Print",
            "ForeignCurrency": None
        }


      
        
        response = requests.post(api_url,json=supplierpayment, headers=headers)
        data=response.headers

        
        # print("-------------------dk--------------------")
        # print("Response:", response.status_code, response.content)
        # print(response)
        # print('2222')
        # print(request.headers)
        # print("--------------------")
    

        if response.status_code == 201:

            location = data['Location']
        
            if location:
                parts = location.split('/')
                uid = parts[-1]

                supplier_payment.uid=uid
                supplier_payment.save()
            messages.success(request, 'Supplier Bill Pay Successfully.')
            return redirect('supplier:supplier_payment_list',supplier_invoice.id)
        else:

            messages.success(request, 'Failed To Create Supplier Payment.')
            return redirect('supplier:supplier_payment_list',supplier_invoice.id)
        




@login_required
def supplier_payment_list(request,id):
    supplier_invoice=Supplier_Invoice.objects.get(id=id)
    supplier_payment_check(request,id)


    payment_lists = Supplier_Payment.objects.filter(supplier_invoice=supplier_invoice)
    payment=Supplier_Payment.objects.filter(supplier_invoice=supplier_invoice).last()

    if payment:
        payable_amount=payment.payable_amount
    else:
        payable_amount=supplier_invoice.total
 
    return render(request,'pages/supplier_bill/payment_list.html',{'supplier_invoice':supplier_invoice,'payment_lists':payment_lists,'payable_amount':payable_amount})



@login_required
def list_supplier_bill(request):
    supplier_invoices=Supplier_Invoice.objects.filter(deleted_at__isnull=True)
    return render(request,'pages/supplier_bill/list_supplier_bill.html',{'supplier_invoices':supplier_invoices})


@login_required
def add_supplier_bill(request):
    suppliers=Supplier.objects.filter(deleted_at__isnull=True)
    products = Product.objects.filter(is_active=True)
    discounts = Discount.objects.all()
    gsts = GST.objects.all()
    if request.method == "POST":
        refresh_token(request)
        myobdata = MyobModel.objects.first()
        if not myobdata:
            messages.error(request,'Please First create Access Code')
            return redirect('/myob/initiate-connection')
        
        supplier_id=request.POST.get('supplier')
        invoice_number=request.POST.get('invoice_number')
        invoice_date =  request.POST.get('invoice_date')
        attachment = request.FILES['attachment']
        due_date =  request.POST.get('due_date')
        product_ids = request.POST.getlist('product[]', [])
        qty_values = request.POST.getlist('qty[]', [])
        # serial_numbers= request.POST.getlist('serialnumber[]', [])

    
        cost_per_unit_values =  request.POST.getlist('cost_per_unit[]', [])
        subtotal_values = request.POST.getlist('subtotal[]', [])
        grandsubtotal = float(request.POST.get('grandsubtotal'))
        gst_percent =int( request.POST.get('gst'))
        total = request.POST.get('total')
        sent_mail = request.POST.get('sent_mail')
        status = request.POST.get('status')
       
        if(request.POST.get('discount_type')=='dollar'):
            discount_type="$"
            discount_percent= 0
            discount = int(int(re.findall('\d+', request.POST.get('dollar_type'))[0]) ) 
            discount_percent_myob=Decimal(discount/grandsubtotal*100)
        else:
            discount_type="%"
            discount_percent= int(request.POST.get('discount'))
            discount = grandsubtotal * ( discount_percent / 100)  
            discount_percent_myob=Decimal(discount_percent)
        grand_subtotal= grandsubtotal-discount
        gst = grand_subtotal * ( gst_percent / 100) 


        # payable_amount=grand_subtotal
       
        # paid_amount=float(request.POST.get('paid_amount'))
        # due_amount=payable_amount-paid_amount


        start_date_obj = datetime.strptime(invoice_date, '%d-%m-%Y').strftime('%Y-%m-%d')
       
        due_date_obj = datetime.strptime(due_date, '%d-%m-%Y').strftime('%Y-%m-%d')


       
        if status:
            status = status
        else:
            status = 0

        is_active = request.POST.get('is_active')

        # if is_active is None:
        #     is_active = False
        if is_active:
            is_active = is_active
        else:
            is_active = True
    
        supplier = Supplier.objects.get(id=supplier_id)
        print("ddddd")
        print(supplier)
        
        supplier_invoice = Supplier_Invoice.objects.create(
            supplier=supplier,
            invoice_number=invoice_number,
            invoice_date=start_date_obj,
            due_date=due_date_obj,
            subtotal= grandsubtotal,
            discount_percent=discount_percent,
            discount=discount,
            discount_type=discount_type,
            total=total,
            payable_amount=total,
           
            # payable_amount=payable_amount,
            # paid_amount=paid_amount,
            # due_amount=abs(due_amount),

            gst_percent=gst_percent,
            gst=gst,
            status=status,
            is_active=is_active,
            created_by=request.user
        )
        print(product_ids)
        invoiceitems = []

        for i in range(len(product_ids)):
            product_id = product_ids[i]
            qty = int(qty_values[i]) 
            cost_per_unit_str = cost_per_unit_values[i]
            cost_per_unit_str = cost_per_unit_str.replace('$', '') 
            cost_per_unit = Decimal(cost_per_unit_str)
            subtotal_str = subtotal_values[i]
            subtotal_str = subtotal_str.replace('$', '')  
            subtotal = Decimal(subtotal_str)

            product_obj = Product.objects.get(id=product_id)

            invoiceitem = Supplier_InvoiceItem(
                supplier_invoice= supplier_invoice,  
                product=product_obj,
                cost_per_unit=cost_per_unit,
                qty=qty,
                subtotal=subtotal,
            )
            invoiceitem.save()

            invoiceitems.append(invoiceitem)

            invoice = Supplier_Invoice.objects.latest('id')


            api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Purchase/Bill/Item"


        details = []
        
        for i in range(len(product_ids)):
            product_id = product_ids[i]
            product_obj = Product.objects.get(id=product_id)

            product_names = product_obj.product_name
           

            subtotal_str = subtotal_values[i]
            subtotal_str=subtotal_str.replace('$', '')
            subtotal = Decimal(subtotal_str)

            cost_per_unit_str = cost_per_unit_values[i]
            cost_per_unit_str = cost_per_unit_str.replace('$', '')
            cost_per_unit = Decimal(cost_per_unit_str)
            detail ={
                    "Type": "Transaction",
                    "Description":product_names + f"({product_obj.sku})" ,   # + ",".join(serial_numbers_list),  
                    "BillQuantity": int(qty_values[i]),
                    "ReceivedQuantity" : int(qty_values[i]),
                    "UnitPrice": float(cost_per_unit),
                    # "UnitCount" :int(qty_values[i]),
                    "DiscountPercent" :float(discount_percent_myob),
                    # "Account": {
                    #     "UID": "d6343c99-8ae8-4f21-8723-87e6b540c9ca",
                    # },
                    "TaxCode": {
                         "UID":"62324ffa-0dd0-4429-bdb0-623289f1216d"
                        # "UID": "6f5fce5d-604f-49db-9a56-8573e7d2a5ec",
                        
                    },
                    "Item": {
                        "UID": product_obj.uid,
                    },
                }

            details.append(detail)


           

            invoice_data={
                "Number": invoice.id,
                "Date":invoice.invoice_date.strftime('%Y-%m-%dT%H:%M:%S'),
                "SupplierInvoiceNumber": invoice.invoice_number,
                "Supplier": {
                    "UID": supplier.myob_uid,
                },
                "ShipToAddress": supplier.city,
                "Terms": { 
                    "PaymentIsDue": "DayOfMonthAfterEOM",
                    "DiscountDate": 1,
                    "BalanceDueDate": 30,
                    "DiscountForEarlyPayment": 0,
                    "MonthlyChargeForLatePayment": 0,
                    "DiscountExpiryDate": None,
                    "Discount":float(invoice.discount),
                    "DueDate": invoice.due_date.strftime('%Y-%m-%dT%H:%M:%S'),
                },
                "IsTaxInclusive": False,
                "IsReportable": False,
                "Lines":details,
                "Subtotal": float(invoice.subtotal),
                "Freight": 0,
                "FreightTaxCode":  {
                        "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d"
                    },
                "TotalTax": float(invoice.gst),
                "TotalAmount": float(invoice.total),
                "Category": None,
                "Comment": "",
                "ShippingMethod": None,
                "PromisedDate": None,
                "JournalMemo": "Purchase; 786",
                "BillDeliveryStatus": "Print",
                "AppliedToDate": 0,
                "BalanceDueAmount": 0,
                "Status": "Open",
                "LastPaymentDate": None,
                "Order": None,
                "ForeignCurrency":None
            }

        post_json = json.dumps(invoice_data)
        
        headers = {
            'Authorization': f'Bearer {myobdata.access_token}',
            'x-myobapi-key': settings.MYOB_CLIENT_ID,
            'x-myobapi-version': 'v2',
            'Content-Type': 'application/json',
           
        }

        response = requests.post(api_url, data=post_json, headers=headers)
        data=response.headers



        print("-------------------dk--------------------")
        print("Response:", response.status_code, response.content)
        print(response)
        print('2222')
        print(request.headers)
        print("--------------------")
        print(data)
        if response.status_code == 201:
            
            location = data['Location']
        
            if location:
                parts = location.split('/')
                uid = parts[-1]

                
                invoice.uid = uid
               
                invoice.save()

                api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Purchase/Bill/Item/{uid}/Attachment"
                
                file_content = attachment.read()
                file_base64 = base64.b64encode(file_content).decode('utf-8')
                attachment_data = {
                "Attachments" : [
                                {
                                "OriginalFileName" : f"{uid}-item.pdf",
                                "FileBase64Content" : file_base64
                                }
                ]
                    }


                response = requests.post(api_url, json=attachment_data, headers=headers)

                if response.status_code == 200:
                    invoice = Supplier_Invoice.objects.get(uid=uid)
                    invoice.attachment.save(f'{uid}-item.pdf', attachment)
                 

     
                messages.success(request, 'Supplier  Bill Created Successfully.')
                return redirect('supplier:bill_list')
        
        else:
            messages.error(request, 'Failed To Create Bill.')
            return redirect('supplier:bill_list')

        return redirect('supplier:bill_list')
    
    return render(request,'pages/supplier_bill/add_supplier_bill.html',{'suppliers':suppliers,'products':products,'discounts':discounts,'gsts':gsts})

@login_required
def edit_supplier_bill(request,id):
    supplier_invoice=Supplier_Invoice.objects.get(id=id)
    suppliers=Supplier.objects.filter(is_active=True)
    invoiceitems = Supplier_InvoiceItem.objects.filter(supplier_invoice=supplier_invoice)
    products = Product.objects.filter(is_active=True)
    # invoices=Invoice.objects.all()
    if request.method == 'POST':

        refresh_token(request)
   
        myobdata = MyobModel.objects.first()
        if not myobdata:
            messages.error(request,'Please First create Access Code')
            return redirect('/myob/initiate-connection')
        
        UID=supplier_invoice.uid
        api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Purchase/Bill/Item/{UID}"

        supplier_id = request.POST.get('supplier')
        print(supplier_id)
        invoice_date = request.POST.get('invoice_date') 
        due_date = request.POST.get('due_date') 
        invoice_number=request.POST.get('invoice_number') 
        attachment = request.FILES['attachment']
        product_ids = request.POST.getlist('product[]', [])
        qty_values = request.POST.getlist('qty[]', [])
        # serial_numbers= request.POST.getlist('serialnumber[]', [])
        cost_per_unit_values =  request.POST.getlist('cost_per_unit[]', [])
        subtotal_values = request.POST.getlist('subtotal[]', [])
        grandsubtotal = float(request.POST.get('grandsubtotal'))   
        gst_percent =int( request.POST.get('gst'))
        total = request.POST.get('total')

        print("deepak")
        print(total)

        sent_mail = request.POST.get('sent_mail')
        status = request.POST.get('status')
       
        if(request.POST.get('discount_type')=='dollar'):
            discount_type="$"
            discount_percent= 0
            discount = int(int(re.findall('\d+', request.POST.get('dollar_type'))[0]) ) 
            discount_percent_myob=Decimal(discount/grandsubtotal*100)
        else:
            discount_type="%"
            discount_percent= int(request.POST.get('discount'))
            discount = grandsubtotal * ( discount_percent / 100)  
            discount_percent_myob=Decimal(discount_percent)
        grand_subtotal= grandsubtotal-discount
        gst = grand_subtotal * ( gst_percent / 100) 
        start_date_obj = datetime.strptime(invoice_date, '%d-%m-%Y').strftime('%Y-%m-%d')
        due_date_obj = datetime.strptime(due_date, '%d-%m-%Y').strftime('%Y-%m-%d')

        if status:
            status = status
        else:
            status = 0

        is_active = request.POST.get('is_active')

        # if is_active is None:
        #     is_active = False
        if is_active:
            is_active = is_active
        else:
            is_active = True

        supplier = Supplier.objects.get(id=supplier_id)
        print(supplier)
        supplier_invoice.supplier = supplier
        supplier_invoice.invoice_date = start_date_obj
        supplier_invoice.due_date = due_date_obj
        supplier_invoice.invoice_number = invoice_number
        supplier_invoice.subtotal = grand_subtotal
        supplier_invoice.discount_percent=discount_percent
        supplier_invoice.discount = discount
        supplier_invoice.discount_type = discount_type
        supplier_invoice.total = total
        supplier_invoice.payable_amount=total
           
        supplier_invoice.gst_percent=gst_percent
        supplier_invoice.gst=gst
        supplier_invoice.status = status
        supplier_invoice.is_active = is_active

      
        supplier_invoice.save()

        

        invoice_items = []
        invoiceitems = Supplier_InvoiceItem.objects.filter(supplier_invoice=supplier_invoice).delete()
        for i in range(len(product_ids)):
            product_id = product_ids[i]
            qty = int(qty_values[i])
            cost_per_unit_str = cost_per_unit_values[i]
            cost_per_unit_str = cost_per_unit_str.replace('$', '')
            cost_per_unit = Decimal(cost_per_unit_str)
            subtotal_str = subtotal_values[i]
            subtotal_str = subtotal_str.replace('$', '')
            subtotal = Decimal(subtotal_str)

            product_obj = Product.objects.get(id=product_id)

            invoiceitem = Supplier_InvoiceItem(
                supplier_invoice= supplier_invoice,  
                product=product_obj,
                cost_per_unit=cost_per_unit,
                qty=qty,
                subtotal=subtotal,
            )
            invoiceitem.save()

            invoice_items.append(invoiceitem)


            headers = {
            'Authorization': f'Bearer {myobdata.access_token}',
            'x-myobapi-key': settings.MYOB_CLIENT_ID,
            'x-myobapi-version': 'v2',
            'Content-Type': 'application/json',
            'Accept-Encoding': 'gzip,deflate'
        }

        
        if UID:
            response = requests.get(api_url, headers=headers)

            print(response.content)
            response_json = response.json()
            print(response_json)
            current_row_version = response_json.get('RowVersion')
            data= response_json 
            # row_id = data['Lines'][0]['RowID']
            # row_version = data['Lines'][0]['RowVersion']
            # balance_due_amount = data['BalanceDueAmount']


          
            
            lines = []  # Initialize the list to store line items

            for i in range(len(product_ids)):
                product_id = product_ids[i]
                product_obj = Product.objects.get(id=product_id)
                product_names = product_obj.product_name
                # serial_numbers_obj = SerialNumber.objects.filter(order=invoice.id,product=product_obj )
                # serial_numbers_list =[serial_number.serial_number for serial_number in serial_numbers_obj]
              
                print(discount_percent)
                
                subtotal_str = subtotal_values[i]
                subtotal_str=subtotal_str.replace('$', '')
                subtotal = Decimal(subtotal_str)

                cost_per_unit_str = cost_per_unit_values[i]
                cost_per_unit_str = cost_per_unit_str.replace('$', '')
                cost_per_unit = Decimal(cost_per_unit_str)

                # Create a line item for the current product
                line_item = {
                    "Item": {
                        "UID": product_obj.uid,
                    },
                    
                    "Type": "Transaction",
                    "Description":product_names + f"({product_obj.sku})", # + ",".join(serial_numbers_list),  
                    "BillQuantity": int(qty_values[i]),
                    "ShipQuantity" : int(qty_values[i]),
                    "UnitPrice": float(cost_per_unit),
                    "UnitCount" :int(qty_values[i]),
                    "DiscountPercent" :float(discount_percent_myob),
                    # "Account": {
                    #     "UID": "d6343c99-8ae8-4f21-8723-87e6b540c9ca",
                    # },
                    "TaxCode": {
                        "UID":"62324ffa-0dd0-4429-bdb0-623289f1216d"
                        # "UID": "6f5fce5d-604f-49db-9a56-8573e7d2a5ec",
                    },
        
                }

                lines.append(line_item) 
          
                invoice = Supplier_Invoice.objects.latest('id')
    
                invoice_data={
                    "UID": invoice.uid,
                    "Number": invoice.id,
                    "Date":invoice.invoice_date.strftime('%Y-%m-%dT%H:%M:%S'),
                    "SupplierInvoiceNumber": invoice.invoice_number,
                    "Supplier": {
                        "UID": supplier.myob_uid,
                    },
                    "ShipToAddress": supplier.city,
                    "Terms": { 
                        "PaymentIsDue": "DayOfMonthAfterEOM",
                        "DiscountDate": 1,
                        "BalanceDueDate": 30,
                        "DiscountForEarlyPayment": 0,
                        "MonthlyChargeForLatePayment": 0,
                        "DiscountExpiryDate": None,
                        "Discount":float(invoice.discount),
                        "DueDate": invoice.due_date.strftime('%Y-%m-%dT%H:%M:%S'),
                    },
                    "IsTaxInclusive": False,
                    "IsReportable": False,
                    "Lines":lines,
                    "Subtotal": float(invoice.subtotal),
                    "Freight": 0,
                    "FreightTaxCode": {
                            "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d"
                        },
                    "TotalTax": float(invoice.gst),
                    "TotalAmount": float(invoice.total),
                    "Category": None,
                    "Comment": "",
                    "ShippingMethod": None,
                    "PromisedDate": None,
                    "JournalMemo": "Purchase; 786",
                    "BillDeliveryStatus": "Print",
                    "AppliedToDate": 0,
                    "BalanceDueAmount": 0,
                    "Status": "Open",
                    "LastPaymentDate": None,
                    "Order": None,
                    "ForeignCurrency":None,
                    "RowVersion":current_row_version, 
                }

            post_json = json.dumps(invoice_data)
            
            headers = {
                'Authorization': f'Bearer {myobdata.access_token}',
                'x-myobapi-key': settings.MYOB_CLIENT_ID,
                'x-myobapi-version': 'v2',
                'Content-Type': 'application/json',
            }

            response = requests.put(api_url, data=post_json, headers=headers)
            

            print("-------------------dk--------------------")
            print("Response:", response.status_code, response.content)
            print(response)
            print('2222')
            print(request.headers)
            print("--------------------")
            data=response.headers
            print(data)
            if response.status_code == 200:
                location = data['Location']
            
                if location:
                    parts = location.split('/')
                    uid = parts[-1]    
                    api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Sale/Invoice/Item/{uid}"
                    print(api_url)

                    invoice.uid = uid
                    # invoice.myob_invoice_pdf.save(f'{invoice.id}_invoice.pdf', content)
                    invoice.save()

                    api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Purchase/Bill/Item/{uid}/Attachment"
                
                    file_content = attachment.read()
                    file_base64 = base64.b64encode(file_content).decode('utf-8')
                    attachment_data = {
                    "Attachments" : [
                                    {
                                    "OriginalFileName" : f"{uid}-item.pdf",
                                    "FileBase64Content" : file_base64
                                    }
                    ]
                        }


                    response = requests.post(api_url, json=attachment_data, headers=headers)

                    if response.status_code == 200:
                        invoice = Supplier_Invoice.objects.get(uid=uid)
                        invoice.attachment.save(f'{uid}-item.pdf', attachment)

             
                    messages.success(request, 'Bill Updated Successfully.')
                    return redirect('supplier:bill_list')
            
                else:
                    messages.success(request, 'Supplier Bill Updated Successfully.')
                    return redirect('supplier:bill_list')
            else:
                messages.error(request, 'Failed To Update Bill.')
                return redirect('supplier:bill_list')
    else:
      
        discounts = Discount.objects.all()

        gsts = GST.objects.all()
        return render(request,'pages/supplier_bill/edit_supplier_bill.html',{'supplier_invoice':supplier_invoice,'invoiceitems':invoiceitems,'suppliers':suppliers,'products':products,'discounts':discounts,'gsts':gsts})


@login_required
def delete_supplier_bill(request,id):
    supplie_invoices=Supplier_Invoice.objects.get(id=id)
    supplie_invoices.delete()
    messages.success(request, 'Supplier Invoice Deleted Successfully.')
    return redirect('supplier:bill_list')















# @login_required
# def list_payment_invoice(request):
#     supplie_invoices=Supplier_Invoice.objects.all()

#     return render(request,'pages/supplier/payment_list.html',{'supplie_invoices':supplie_invoices})






# @login_required
# def add_payment_invoice(request):
#     suppliers=Supplier.objects.all() 
   
#     if request.method == "POST":
#         invoice_number=request.POST.get('invoice_number')
#         payable_amount=int(request.POST.get('payable_amount'))
#         paid_amount=int(request.POST.get('paid_amount'))
#         supplier_id=request.POST.get('supplier')
#         due_amount=payable_amount-paid_amount
#         supplier = Supplier.objects.get(id=supplier_id)
#         supplier_invoice=Supplier_Invoice(
#             supplier=supplier,
#             invoice_number=invoice_number,
#             payable_amount=payable_amount,
#             paid_amount=paid_amount,
#             due_amount=due_amount,
#         )
#         supplier_invoice.save()  
#         messages.success(request, ' Payment Invoice Added Successfully.')
#         return redirect('supplier:payment_list')
    
#     return render(request,'pages/supplier/add_payment_invoice.html',{'suppliers':suppliers})

# @login_required
# def list_payment_invoice(request):
#     supplie_invoices=Supplier_Invoice.objects.all()

#     return render(request,'pages/supplier/payment_list.html',{'supplie_invoices':supplie_invoices})


# @login_required
# def edit_payment_invoice(request,id):
#     supplie_invoice=Supplier_Invoice.objects.get(id=id)
#     suppliers=Supplier.objects.all()
#     if request.method == "POST":
#         invoice_number=request.POST.get('invoice_number')
#         payable_amount=int(request.POST.get('payable_amount'))
#         paid_amount=int(request.POST.get('paid_amount'))
#         supplier_id=request.POST.get('supplier')
#         due_amount=payable_amount-paid_amount

#         supplier = Supplier.objects.get(id=supplier_id)
       
#         supplie_invoice.invoice_number=invoice_number
#         supplie_invoice.payable_amount=payable_amount
#         supplie_invoice.paid_amount=paid_amount
#         supplie_invoice.supplier=supplier
#         supplie_invoice.invoice_number=due_amount
#         supplie_invoice.save()

#         messages.success(request, ' Payment Invoice Updated Successfully.')
#         return redirect('supplier:payment_list')
    
#     return render(request,'pages/supplier/edit_payment_invoice.html',{'supplie_invoice':supplie_invoice,'suppliers':suppliers})



# @login_required
# def delete_payment_invoice(request,id):
#     supplie_invoices=Supplier_Invoice.objects.get(id=id)
#     supplie_invoices.delete()
#     messages.success(request, ' Payment Invoice Deleted Successfully.')
#     return redirect('supplier:payment_list')








@login_required
def list_supplier(request):


    supplier=Supplier.objects.filter(deleted_at__isnull=True )
    return render(request,'pages/supplier/list.html',{'suppliers':supplier})
    
@login_required
def create_supplier(request):
    refresh_token(request)
    context={}
    myobdata = MyobModel.objects.first()
    if not myobdata:
        messages.error(request,'Please First create Access Code')
        return redirect('/myob/initiate-connection')
    
    api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Contact/Supplier"
    if myobdata.access_token:

        if request.method == 'POST':
            form = request.POST
            email = request.POST.get('email')
            if Supplier.objects.filter(email=email).exists():
                messages.error(request, 'Email Is Already Exist.')
                context['form'] = form
                return render(request,'pages/supplier/create.html',context)
            
            supplier_type = request.POST.get('supplier_type')
            
            is_active= request.POST.get('is_active')
        
        
            if is_active is None:
               is_active = False
            else:
                is_active = True
            
            
            supplier_data = {
                
                'is_active':is_active,
                'street': request.POST.get('street'),
                'city': request.POST.get('city'),
                'state': request.POST.get('state'),
                'post_code': request.POST.get('post_code'),
                'country': request.POST.get('country'),
                'phone1': request.POST.get('phone1'),
                'phone2': request.POST.get('phone2'),
                'phone3': request.POST.get('phone3'),
                'fax': request.POST.get('fax'),
                'email': request.POST.get('email'),
                'website': request.POST.get('website'),
                'contact_name': request.POST.get('contact_name'),
                'salutation': request.POST.get('salutation'),
                'abn': request.POST.get('abn'),
            }

            if supplier_type=='1':
                first_name = request.POST.get('first_name')
                last_name = request.POST.get('last_name')
                individual = Supplier(
                    is_individual=int(supplier_type),
                    first_name=first_name,
                    last_name=last_name,
                    **supplier_data,
                    created_by=request.user,
                )
                individual.save()
            else:
                company_name = request.POST.get('company_name')
                company = Supplier(
                    is_individual=int(supplier_type),
                    company_name=company_name,
                    **supplier_data,
                    created_by=request.user,
                    updated_by=request.user,
                )
                company.save()

            suppliers=Supplier.objects.filter(created_by=request.user).last()

            supplier_data={
                "LastName" :suppliers.last_name,
                "FirstName" : suppliers.first_name,
                "Street" : suppliers.street,
                "City" : suppliers.city,
                "State" : suppliers.state,
                "PostCode" : suppliers.post_code,
                "Country" : suppliers.country,
                "Phone1" : suppliers.phone1,
                "Phone2" : suppliers.phone2,
                "Phone3" : suppliers.phone3,
                "Fax" : suppliers.fax,
                "Email" : suppliers.email,
                "Website" : suppliers.website,
                "ContactName" : suppliers.contact_name,
                "Salutation" : suppliers.salutation,
                "IsIndividual" : suppliers.is_individual,
                "IsActive" : suppliers.is_active  ,
                "ABN":suppliers.abn,
                "BuyingDetails" : {
                
                "TaxCode" : {
                    "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
                 
                            
                            },
                    "FreightTaxCode" : {
                            "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
                            
                            },
                    }

                    

            }

            if not suppliers.is_individual:
                supplier_data["CompanyName"] = suppliers.company_name
            


            headers = {
                'Authorization': f'Bearer {myobdata.access_token}',
                'x-myobapi-key': settings.MYOB_CLIENT_ID,
                'x-myobapi-version': 'v2',
                'Content-Type': 'application/json',
                'Accept-Encoding': 'gzip,deflate'
            }

            supplier_json = json.dumps(supplier_data)
            try:
                response = requests.post(api_url, data=supplier_json, headers=headers)
                print("-------------------dk--------------------")
                print("Response:", response.status_code, response.content)
                print(response)
                print('2222')
                print(request.headers)
                print("--------------------")

             
                data=response.headers

                if response.status_code == 201:
                    location = data['Location']
                    if location:
                        parts = location.split('/')
                        uid = parts[-1]
                        suppliers.myob_location = location
                        suppliers.myob_uid = uid
                        suppliers.save()
                        messages.success(request, ' Supplier Added Successfully.')
                        return redirect('supplier:list')
                    else:
                        messages.error(request, 'Location Header Not Found In API Response.')
                        context['form'] = form
                        return render(request,'pages/supplier/create.html',context)
                else:
                    messages.error(request, 'Failed To Add Supplier.')
                    context['form'] = {}
                    return render(request,'pages/supplier/create.html',context)

            except requests.exceptions.RequestException as e:
                messages.error(request, f'An error occurred: {str(e)}')
    context['form'] = {}
    return render(request,'pages/supplier/create.html',context)

    


@login_required    
def edit_supplier(request,id):
    refresh_token(request)
    myobdata = MyobModel.objects.first()
    if not myobdata:
        messages.error(request,'Please First create Access Code')
        return redirect('/myob/initiate-connection')
    
    supplier = Supplier.objects.get(id=id)
    UID=supplier.myob_uid
    api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Contact/Supplier/{UID}"
    
    if request.method == 'POST':
        supplier_type = request.POST.get('supplier_type')
        
        is_active=request.POST.get('is_active')
        
        if is_active is None:
           is_active = False
        else:
            is_active = True
               
        
        if supplier_type=="1":
            supplier.first_name = request.POST.get('first_name')
            supplier.last_name = request.POST.get('last_name')
            # Set other individual fields
        else:
            supplier.company_name = request.POST.get('company_name')
            # Set other company fields
        supplier.is_active=is_active
        supplier.street = request.POST.get('street')
        supplier.city = request.POST.get('city')
        supplier.state = request.POST.get('state')
        supplier.post_code = request.POST.get('post_code')
        supplier.country = request.POST.get('country')
        supplier.phone1 = request.POST.get('phone1')
        supplier.phone2 = request.POST.get('phone2')
        supplier.phone3 = request.POST.get('phone3')
        supplier.fax = request.POST.get('fax')
        supplier.email = request.POST.get('email')
        supplier.website = request.POST.get('website')
        supplier.contact_name = request.POST.get('contact_name')
        supplier.salutation = request.POST.get('salutation')
        supplier.abn = request.POST.get('abn')

        supplier.updated_by = request.user
        supplier.save()


        
        headers = {
            'Authorization': f'Bearer {myobdata.access_token}',
            'x-myobapi-key': settings.MYOB_CLIENT_ID,
            'x-myobapi-version': 'v2',
            'Content-Type': 'application/json',
            'Accept-Encoding': 'gzip,deflate'
        }


        if UID:
      
            response = requests.get(api_url, headers=headers)
            response_json = response.json()
            current_row_version = response_json.get('RowVersion')


            supplier_data={
                "RowVersion": current_row_version,
                "UID":supplier.myob_uid,
                "LastName" :supplier.last_name,
                "FirstName" : supplier.first_name,
                "Street" : supplier.street,
                "City" : supplier.city,
                "State" : supplier.state,
                "PostCode" : supplier.post_code,
                "Country" : supplier.country,
                "Phone1" : supplier.phone1,
                "Phone2" : supplier.phone2,
                "Phone3" : supplier.phone3,
                "Fax" : supplier.fax,
                "Email" : supplier.email,
                "Website" : supplier.website,
                "ContactName" : supplier.contact_name,
                "Salutation" : supplier.salutation,
                "IsIndividual" : supplier.is_individual,
                "IsActive" : supplier.is_active  ,
                "ABN":supplier.abn,
                "BuyingDetails" : {
            
            "TaxCode" : {
                "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
               
                  
                    
                        
                        },
                "FreightTaxCode" : {
                        "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
                        
                        },
                }
           

            }

            if not supplier.is_individual:
                supplier_data["CompanyName"] = supplier.company_name
            
    
            supplier_json = json.dumps(supplier_data)
            response = requests.put(api_url, data=supplier_json, headers=headers)
          
            data=response.headers
            if response.status_code == 200:
                location = data['Location']
                if location:
                    parts = location.split('/')
                    uid = parts[-1]
                    supplier.myob_location = location
                    supplier.current_row_version=current_row_version
                    supplier.myob_uid = uid
                    supplier.save()
                messages.success(request, 'Supplier Updated Successfully.')
                return redirect('supplier:list')
            else:
                messages.error(request, 'Failed To Update Supplier.')
                return redirect('supplier:create')
        else:
            messages.success(request, 'Supplier Updated Successfully.')
            return redirect('supplier:list')

    return render(request,'pages/supplier/edit.html',{'supplier': supplier})
    
    
@login_required
def sync_myob_supplier(request,id):

    refresh_token(request)
    myobdata = MyobModel.objects.filter(created_by=request.user).first()
    if not myobdata:
        messages.error(request,'Please First create Access Code')
        return redirect('/myob/initiate-connection')

    supplier = Supplier.objects.get(id=id)
    api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Contact/supplier/"

    headers = {
        'Authorization': f'Bearer {myobdata.access_token}',
        'x-myobapi-key': settings.MYOB_CLIENT_ID,
        'x-myobapi-version': 'v2',
        'Content-Type': 'application/json',
        'Accept-Encoding': 'gzip,deflate'
    }
    

    supplier_data={
        
        "LastName" :supplier.last_name,
        "FirstName" : supplier.first_name,
        "Street" : supplier.street,
        "City" : supplier.city,
        "State" : supplier.state,
        "PostCode" : supplier.post_code,
        "Country" : supplier.country,
        "Phone1" : supplier.phone1,
        "Phone2" : supplier.phone2,
        "Phone3" : supplier.phone3,
        "Fax" : supplier.fax,
        "Email" : supplier.email,
        "Website" : supplier.website,
        "ContactName" : supplier.contact_name,
        "Salutation" : supplier.salutation,
        "IsIndividual" : supplier.is_individual,
        "IsActive" : supplier.is_active  ,
        "ABN":supplier.abn,
        "BuyingDetails" : {
        
        "TaxCode" : {
            "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
            
                
                
                    
                    },
            "FreightTaxCode" : {
                    "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
                    
                    },
            }           

        }

    if not supplier.is_individual:
        supplier_data["CompanyName"] = supplier.company_name

    supplier_json = json.dumps(supplier_data)
    

    response = requests.post(api_url, data=supplier_json, headers=headers)
    
    data=response.headers
    if response.status_code == 201:
        location = data['Location']
        if location:
            parts = location.split('/')
            uid = parts[-1]
            supplier.myob_location = location
            supplier.myob_uid = uid
            supplier.save()
        messages.success(request, 'Supplier Successfully Sync With Myob.')
        return redirect('supplier:list')
    else:
        messages.error(request, 'Failed To Sync With Myob.')
        return redirect('supplier:list')







# @login_required
# def sync_myob_supplier(request, id):

#     refresh_token(request)
#     myobdata = MyobModel.objects.filter(created_by=request.user).first()
#     if not myobdata:
#         messages.error(request,'Please First create Access Code')
#         return redirect('/myob/initiate-connection')

#     supplier = Supplier.objects.get(id=id)
#     api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Contact/supplier/"

#     if request.method == 'POST':
        
#         supplier_type = request.POST.get('supplier_type')
#         is_individual = supplier_type == 'individual'

       
#         if is_individual:
#             supplier.first_name = request.POST.get('first_name')
#             supplier.last_name = request.POST.get('last_name')
#             # Set other individual fields
#         else:
#             supplier.company_name = request.POST.get('company_name')
#             # Set other company fields
#         supplier.street = request.POST.get('street')
#         supplier.city = request.POST.get('city')
#         supplier.state = request.POST.get('state')
#         supplier.post_code = request.POST.get('post_code')
#         supplier.country = request.POST.get('country')
#         supplier.phone1 = request.POST.get('phone1')
#         supplier.phone2 = request.POST.get('phone2')
#         supplier.phone3 = request.POST.get('phone3')
#         supplier.fax = request.POST.get('fax')
#         supplier.email = request.POST.get('email')
#         supplier.website = request.POST.get('website')
#         supplier.contact_name = request.POST.get('contact_name')
#         supplier.salutation = request.POST.get('salutation')
#         supplier.abn = request.POST.get('abn')

#         supplier.updated_by = request.user
#         supplier.save()

#         headers = {
#             'Authorization': f'Bearer {myobdata.access_token}',
#             'x-myobapi-key': settings.MYOB_CLIENT_ID,
#             'x-myobapi-version': 'v2',
#             'Content-Type': 'application/json',
#             'Accept-Encoding': 'gzip,deflate'
#         }
      


#         supplier_data={
           
#             "LastName" :supplier.last_name,
#             "FirstName" : supplier.first_name,
#             "Street" : supplier.street,
#             "City" : supplier.city,
#             "State" : supplier.state,
#             "PostCode" : supplier.post_code,
#             "Country" : supplier.country,
#             "Phone1" : supplier.phone1,
#             "Phone2" : supplier.phone2,
#             "Phone3" : supplier.phone3,
#             "Fax" : supplier.fax,
#             "Email" : supplier.email,
#             "Website" : supplier.website,
#             "ContactName" : supplier.contact_name,
#             "Salutation" : supplier.salutation,
#             "IsIndividual" : supplier.is_individual,
#             "IsActive" : supplier.is_active  ,
#             "ABN":supplier.abn,
#             "BuyingDetails" : {
            
#             "TaxCode" : {
#                 "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
               
                  
                    
                        
#                         },
#                 "FreightTaxCode" : {
#                         "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
                        
#                         },
#                 }

                    

#             }

#         if not supplier.is_individual:
#             supplier_data["CompanyName"] = supplier.company_name

#         supplier_json = json.dumps(supplier_data)
        
    
#         response = requests.post(api_url, data=supplier_json, headers=headers)
       
#         data=response.headers
#         if response.status_code == 201:
#             location = data['Location']
#             if location:
#                 parts = location.split('/')
#                 uid = parts[-1]
#                 supplier.myob_location = location
#                 supplier.myob_uid = uid
#                 supplier.save()
#             messages.success(request, 'Supplier Successfully Sync Myob.')
#             return redirect('supplier:list_supplier')
#         else:
#             messages.error(request, 'Failed to  Sync Myob Supplier  ')
#             return redirect('supplier:list_supplier')

#     return render(request, 'pages/supplier/myob_sync.html', {'supplier': supplier})




@login_required 
def delete_supplier(request, id):
    refresh_token(request)
    myobdata = MyobModel.objects.first()
    if not myobdata:
        messages.error(request,'Please First create Access Code')
        return redirect('/myob/initiate-connection')
    
    supplier = Supplier.objects.get(id=id)
    supplier.deleted_by = request.user  
    supplier.soft_delete()
    UID=supplier.myob_uid

    
    api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Contact/supplier/{UID}"
    if UID:
     
        headers = {
            'Authorization': f'Bearer {myobdata.access_token}',
            'x-myobapi-key': settings.MYOB_CLIENT_ID,
            'x-myobapi-version': 'v2',
            'Content-Type': 'application/json',
            'Accept-Encoding': 'gzip,deflate'
        }


       
        print(headers)
        response = requests.get(api_url, headers=headers)
        response_json = response.json()
        current_row_version = response_json.get('RowVersion')

        supplier_data={
            "RowVersion": current_row_version,
            "UID":supplier.myob_uid,
            "LastName" :supplier.last_name,
            "FirstName" : supplier.first_name,
            "Street" : supplier.street,
            "City" : supplier.city,
            "State" : supplier.state,
            "PostCode" : supplier.post_code,
            "Country" : supplier.country,
            "Phone1" : supplier.phone1,
            "Phone2" : supplier.phone2,
            "Phone3" : supplier.phone3,
            "Fax" : supplier.fax,
            "Email" : supplier.email,
            "Website" : supplier.website,
            "ContactName" : supplier.contact_name,
            "Salutation" : supplier.salutation,
            "IsIndividual" : supplier.is_individual,
            "IsActive" : supplier.is_active  ,
            "ABN":supplier.abn,
            "BuyingDetails" : {
            
            "TaxCode" : {
                "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
               
                  
                    
                        
                        },
                "FreightTaxCode" : {
                        "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
                        
                        },
                }
           
                    

            }

        if not supplier.is_individual:
            supplier_data["CompanyName"] = supplier.company_name
        

        supplier_json = json.dumps(supplier_data)
        response = requests.put(api_url, data=supplier_json, headers=headers)
        print(response)
        data=response.headers

        if response.status_code == 200:
            location = data['Location']
            if location:
                parts = location.split('/')
                uid = parts[-1]
                supplier.myob_location = location
                supplier.myob_uid = uid
                supplier.save()
            messages.success(request, 'Supplier Deleted Successfully.')
            return redirect('supplier:list')
        else:
            messages.error(request, 'Failed To Delete Supplier.')
            return redirect('supplier:list')

    else:
        messages.success(request, 'Supplier Deleted Successfully.')
        return redirect('supplier:list')
    
