import requests
from django.shortcuts import redirect, render
from django.contrib import messages
from django.conf import settings
from myobconnect.models import MyobModel
from django.contrib.auth.decorators import login_required
from urllib.parse import urlencode
import json



@login_required
def connect(request):
    authorization_url = 'https://secure.myob.com/oauth2/account/authorize'
    params = {
        'client_id': settings.MYOB_CLIENT_ID,
        'redirect_uri': settings.MYOB_REDIRECT_URI,
        'response_type': 'code',
        'scope': 'CompanyFile',
    }
  
    url = f"{authorization_url}?{urlencode(params)}"
    print(url)
    return redirect(url)


@login_required
def index(request):
    code_param = request.GET['code']#get_code_param(request)
    if not code_param:
        messages.error(request, 'No code parameter found in the URL')
        return redirect('/myob/initiate-connection')

    token_url = 'https://secure.myob.com/oauth2/v1/authorize/'
    data = {
        'client_id': settings.MYOB_CLIENT_ID,
        'client_secret': settings.MYOB_CLIENT_SECRET,
        'code': code_param,
        'redirect_uri': settings.MYOB_REDIRECT_URI,
        'grant_type': 'authorization_code',
    }

    headers = {'Content-Type': 'application/x-www-form-urlencoded'}

    response = requests.post(token_url, data=data, headers=headers)

    
    if response.status_code == 200:
        token_data = response.json()
        access_token = token_data.get('access_token')
        refresh_token = token_data.get('refresh_token')
        myobdata = MyobModel.objects.first()
        print(response.json())
        print(access_token)
    
        
        dataarray = {
            'access_code': code_param,
            'access_token': access_token,
            'refresh_token': refresh_token,
            'created_by': request.user,
            'updated_by': request.user,
            'scope':token_data.get('scope'),
            'expire_in':token_data.get('expires_in'),
            'connected': 1
        }

        if not myobdata:
            MyobModel.objects.create(**dataarray)
        else:
            print('in else') 
            print(token_data.get('scope'))           
            myobdata.access_code= code_param
            myobdata.access_token= access_token
            myobdata.refresh_token= refresh_token
            myobdata.created_by= request.user
            myobdata.updated_by= request.user
            myobdata.scope=token_data.get('scope')
            myobdata.expire_in=token_data.get('expires_in')
            myobdata.connected= 1
                
            myobdata.save()

        messages.success(request, 'Connected to MYOB successfully.')
    else:
        messages.error(request, 'Failed to authenticate with MYOB')

    return redirect('/myob/initiate-connection')

@login_required
def checkconnect(request):
    myobdata = MyobModel.objects.first()
    if myobdata:
        connected = myobdata.connected
    else:
        connected = False
    return render(request, 'myob_integration/connect.html', {'myobdata': myobdata, 'connected': connected})



@login_required
def NewAccessToken(request):
    myobdata = MyobModel.objects.first()
    if not myobdata:
        messages.error(request, 'No code parameter found in the URL')
        return redirect('/myob/initiate-connection')

    token_url = 'https://secure.myob.com/oauth2/v1/authorize/'
    data = {
        'client_id': settings.MYOB_CLIENT_ID,
        'client_secret': settings.MYOB_CLIENT_SECRET,
        'grant_type': 'authorization_code',
        'code': myobdata.access_code,
        'redirect_uri': settings.MYOB_REDIRECT_URI,   

    }

    headers = {'Content-Type': 'application/x-www-form-urlencoded'}

    try:
        print("#########")
        response = requests.post(url=token_url, data=urlencode(data), headers=headers)
        print(response)

        if response.status_code == 200:
            response_data = response.json()
            access_token = response_data.get('access_token')
            refresh_token = response_data.get('refresh_token')
            dataarray = {
                'access_code': myobdata.access_code,
                'access_token': access_token,
                'refresh_token': refresh_token,
                'created_by': request.user,
                'updated_by': request.user,
                'connected': 1
            }

            if not myobdata:
                MyobModel.objects.create(**dataarray)
            else:
                myobdata.save()

            messages.success(request, 'New Access Token Generated')
        else:
            messages.error(request, 'Failed to fetch the Access Token')

    except requests.exceptions.RequestException as e:
        messages.error(request, f'An error occurred: {str(e)}')

    return redirect('/myob/initiate-connection')

@login_required
def GetRefreshToken(request):
    myobdata = MyobModel.objects.first()
    if not myobdata:
        messages.error(request, 'Please First create Access Code')
        return redirect('/myob/initiate-connection')


    token_url = 'https://secure.myob.com/oauth2/v1/authorize'
    data = {
        'client_id': settings.MYOB_CLIENT_ID,
        'client_secret': settings.MYOB_CLIENT_SECRET,
        'refresh_token':myobdata.refresh_token,
        'grant_type': 'refresh_token',
    }

    headers = {'Content-Type': 'application/x-www-form-urlencoded'}

    try:
        response = requests.post(url=token_url, data=data, headers=headers)

        if response.status_code == 200:
            response_data = response.json()           
            # myobdata.access_code = response_data.get('access_code')
            myobdata.access_token = response_data.get('access_token')
            myobdata.refresh_token = response_data.get('refresh_token')
            myobdata.save()
            messages.success(request, 'Access Token Refreshed Successfully')
        else:
            messages.error(request, 'Failed to refresh access token')

    except requests.exceptions.RequestException as e:
        messages.error(request, f'An error occurred: {str(e)}')

    return redirect('/myob/initiate-connection')




def refresh_token(request):
    myobdata = MyobModel.objects.first()
    if not myobdata:
        messages.error(request, 'Please First create Access Code')
        return redirect('/myob/initiate-connection')


    token_url = 'https://secure.myob.com/oauth2/v1/authorize'
    data = {
        'client_id': settings.MYOB_CLIENT_ID,
        'client_secret': settings.MYOB_CLIENT_SECRET,
        'refresh_token':myobdata.refresh_token,
        'grant_type': 'refresh_token',
    }

    headers = {'Content-Type': 'application/x-www-form-urlencoded'}

  
    response = requests.post(url=token_url, data=data, headers=headers)

    if response.status_code == 200:
        response_data = response.json()           
        # myobdata.access_code = response_data.get('access_code')
        myobdata.access_token = response_data.get('access_token')
        myobdata.refresh_token = response_data.get('refresh_token')
        myobdata.save()
        