from django.shortcuts import redirect, render
from django.contrib import messages
from customer.models import Customer
from .models import User
from user.models import UserInfo
from authentication.decorators import is_admin, is_sales, is_technician, is_customer,is_superuser,is_supplier
from django.contrib.auth.decorators import user_passes_test,login_required
import requests
from myobconnect.models import MyobModel
from myobconnect.views import refresh_token
import json
from django.conf import settings
from supplier.models import Supplier
from django.shortcuts import render, get_object_or_404
from .models import ActivityLog
# from .signals import log_model_post, log_model_get

def activity_log_view(request):
    activity_logs = ActivityLog.objects.all()
    return render(request, 'activity_log.html', {'activity_logs': activity_logs})


# @user_passes_test(lambda u: is_customer(u) or is_admin(u) or is_superuser(u) or is_user(u))
@login_required
def view_profile(request):
    
    

    if is_customer(request.user):
        user_info=Customer.objects.get(customer=request.user.id)
       
        user = User.objects.get(email=request.user)
    
    elif is_supplier(request.user):

        user_info=Supplier.objects.get(user=request.user.id)
       
        user = User.objects.get(email=request.user)


    
    else:
      
        try:
            user = User.objects.get(email=request.user)
            user_info = UserInfo.objects.get(user=user.id)
    
        except UserInfo.DoesNotExist:
            user = User.objects.get(email=request.user)
            user_info = UserInfo(user=user,email=user.email)
            user_info.save()
      

    
    return render(request,'pages/profile/view.html',{'user_info':user_info,'user':user})

# @user_passes_test(lambda u: is_customer(u) or is_admin(u) or is_superuser(u) or is_user(u))
@login_required
def edit_profile(request, id):

    if is_customer(request.user):
        user=User.objects.get(id=id)
      
        customer=Customer.objects.get(user=user)
       
        
  
        if request.method == 'POST':
            context = {}
            refresh_token(request)
            myobdata = MyobModel.objects.first()
            if not myobdata:
                messages.error(request,'Please First create Access Code')
                return redirect('/myob/initiate-connection')
            
            # customer = Customer.objects.get(id=id)
            UID=customer.myob_uid
            print(UID)
            api_url = f"https://ar2.api.myob.com/accountright/{settings.COMPANY_FILE_ID}/Contact/Customer/{UID}"
            form = request.POST
            customer_type = request.POST.get('customer_type')
            
           
            
            

            email=request.POST.get('email')
            password=request.POST.get('password')
            confirm_password=request.POST.get('confirm_password')

            if password !='':
                if password != confirm_password:
                    messages.error(request, 'Passwords Do Not Match.')
                    context['form'] = form
                    return redirect('namespace-name:edit_profile' ,id=id)
                
            if User.objects.filter(email=email).exclude(id=customer.customer.id).exists():
                messages.error(request,  f'User With Email {email} Is Already Exists.')
                return redirect('namespace-name:edit_profile',id )
            user=User.objects.get(id=customer.customer.id)
            user.is_active=True
            user.email=email 
            user.username=email
            user.role = 4
            if password !='':
                if password:
                    user.set_password(password)
                user.save()     
            
            if customer_type=="1":
                customer.first_name = request.POST.get('first_name')
             
                customer.last_name = request.POST.get('last_name')

             
                
            else:
                customer.company_name = request.POST.get('company_name')
             
            # city = request.POST.get('city')
            customer.user=user
            customer.is_active=True
            customer.street = request.POST.get('street')
            customer.city = request.POST.get('city')
            customer.state = request.POST.get('state')
            customer.post_code = request.POST.get('post_code')
            customer.country = request.POST.get('country')
            customer.phone1 = request.POST.get('phone1')
            customer.phone2 = request.POST.get('phone2')
            customer.phone3 = request.POST.get('phone3')
            customer.fax = request.POST.get('fax')
            customer.email = request.POST.get('email')
            customer.website = request.POST.get('website')
            customer.contact_name = request.POST.get('contact_name')
            customer.salutation = request.POST.get('salutation')
            customer.abn = request.POST.get('abn')

            customer.updated_by = request.user
            customer.save()
            if customer.abn  and len(customer.abn ) == 11:
                abnres = f"{customer.abn[:2]} {customer.abn[2:5]} {customer.abn[5:8]} {customer.abn[8:]}"
            else:
                abnres=customer.abn
            
        
            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')


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


                    "BuyingDetails" : {
                
                        "TaxCode" : {
                            "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
                        
                            
                                
                                    
                                    },
                            "FreightTaxCode" : {
                                    "UID": "62324ffa-0dd0-4429-bdb0-623289f1216d",
                                    
                                    },
                            }

                                    
                        }

                if not customer.is_individual:
                    customer_data["CompanyName"] = customer.company_name
                
        
                customer_json = json.dumps(customer_data)
                response = requests.put(api_url, data=customer_json, headers=headers)
               
        
                data=response.headers

                print(data)
                print("deepak")
                print(response.status_code)
                if response.status_code == 200:
                    location = data['Location']
                    print(location)
                    if location:
                        parts = location.split('/')
                        uid = parts[-1]
                        customer.myob_location = location
                        customer.current_row_version=current_row_version
                        customer.myob_uid = uid
                        customer.save()

                    if password:
                        messages.success(request, 'Profile Updated Successfully')
                        return redirect('namespace-name:signin')
                       
                    messages.success(request, 'Profile Updated Successfully')
                    return redirect('namespace-name:profile')
                

                else:
                    messages.error(request, 'Failed To Update Profile.')
                    return redirect('namespace-name:edit_profile')
            else:
                messages.success(request, 'Profile Updated Successfully.')
                return redirect('namespace-name:profile')
            
        return render(request,'pages/profile/edit_customer.html', {'customer':customer})
    

    elif is_supplier(request.user):
            refresh_token(request)
            myobdata = MyobModel.objects.first()
            if not myobdata:
                messages.error(request,'Please First create Access Code')
                return redirect('/myob/initiate-connection')
            user=User.objects.get(id=id)
            supplier = Supplier.objects.get(user=user)
            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')
                
                

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

                if User.objects.filter(email=email).exclude(id=supplier.user.id).exists():
                    messages.error(request,  f'User With Email {email} Is Already Exists.')
                    return redirect('supplier:edit' ,id )

                user=User.objects.get(id=supplier.user.id)
                user.is_active=True
                user.email=email 
                user.username=email
                user.save()     
                    
                
                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.user=user
                supplier.is_active=True
                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, 'Profile Updated Successfully.')
                        return redirect('namespace-name:profile')
                    else:
                        messages.error(request, 'Failed To Update Profile.')
                        return redirect('namespace-name:edit_profile')
                else:
                    messages.success(request, 'Profile Updated Successfully.')
                    return redirect('namespace-name:profile')
            return render(request,'pages/profile/edit_supplier.html',{'supplier': supplier})

    else:
        
        context = {}

        user = User.objects.get(id=id)
        userinfo=UserInfo.objects.get(user=user.id)
    
        if request.method == 'POST':
            
            form = request.POST
            email = request.POST.get('email')
            is_active= request.POST.get('is_active')
            username = email
            role = request.POST.get('role')
            password = request.POST.get('password')
            confirm_password = request.POST.get('confirm_password')
            
            if is_active is None:
                is_active = False
            else:
                is_active = True
            
            if password !='':
                if password != confirm_password:
                    messages.error(request, 'Passwords Do Not Match.')
                    context['form'] = form
                    return redirect('namespace-name:edit_profile' ,id=id)
        
            if not email:
                messages.error(request, 'Please Enter Email.')
                context['form'] = form
                return redirect('namespace-name:edit_profile', id=id)
            
            user=User.objects.get(id=userinfo.user.id)   
            if User.objects.filter(email=email).exclude(id=user.id).exists():
                messages.error(request, 'Email Already Exist.')
                context['form'] = form
                return redirect('namespace-name:edit_profile' , id=id)
            else:
                user.is_active=is_active
                user.username = username
                user.email = email
                user.role = role
                
                if password !='':
                    if password:
                        user.set_password(password)
                    user.save()
                
                userinfo.is_active=is_active
                userinfo.first_name = request.POST.get('first_name')
                userinfo.last_name = request.POST.get('last_name')
                userinfo.street = request.POST.get('street')
                userinfo.city = request.POST.get('city')
                userinfo.state = request.POST.get('state')
                userinfo.post_code = request.POST.get('post_code')
                userinfo.country = request.POST.get('country')
                userinfo.phone1 = request.POST.get('phone1')
                userinfo.email = email
                userinfo.updated_by = request.user

                userinfo.save()

                if password:
                    messages.success(request, 'Profile Updated Successfully.')
                    return redirect('namespace-name:signin')


                messages.success(request, 'Profile Updated Successfully.')
                return redirect('namespace-name:profile')
         
        return render(request,'pages/profile/user_edit.html',{'userinfo':userinfo})

    


