import pandas as pd
import json
import requests
from oauthlib.oauth2 import BackendApplicationClient, OAuth2Session
from datetime import datetime

domain = 'https://mappsacc.mazdaeur.com'
# Production Server 'https://mapps.mazdaeur.com'

webservice = domain + '/dogma-restapi-dms/api'
module = '/vehicles/workshop/order-report'
auth_url = domain + '/oauth/authorize'
token_url = domain + '/oauth/token'

client_id = ''
api_key = ''
user = 'mmd88888.cdk'
password = ''
dealer_number = '11197/MMD'   # Example '10030/MMD'


# token = 'MDDq3CUd9ix0iSqR'


def date_format(d):
    return d.isoformat() + "Z"


def convert_csv(csv_file, json_file):
    date_cols = ['invoiceDate', 'orderDate', 'orderCompletionDate', 'vehicleIntakeDate', 'nextMotDueDate']
    df = pd.read_csv(csv_file, encoding='ansi', decimal=',', sep=';', parse_dates=date_cols)
    # print(df[['currency','documentType','invoiceCategory','invoiceDate','invoiceNumber']].drop_duplicates().info())
    invoices = df[['currency', 'documentType', 'invoiceCategory', 'invoiceDate', 'invoiceNumber']].drop_duplicates().to_dict('records')
    invoice_items = df[['invoiceNumber', 'orderLineNumber', 'orderNumber', 'amount', 'discount', 'portion', 'unitPrice']].groupby('invoiceNumber')

    for invoice in invoices:
        invoice['invoiceDate'] = date_format(invoice['invoiceDate'])
        items = invoice_items.get_group(invoice['invoiceNumber'])
        items.pop('invoiceNumber')
        invoice['invoiceItems'] = items.to_dict('records')

    orders = df[['orderNumber', 'orderDate', 'orderCompletionDate', 'vehicleIntakeDate']].drop_duplicates().to_dict('records')
    orders_vehicle = df[['orderNumber', 'licensePlate', 'nextMotDueDate', 'odometer', 'odometerUnit', 'vin']].drop_duplicates().groupby('orderNumber')
    orders_items = df[[
        'orderNumber', 'lineNumber',
        'category', 'description', 'hours', 'operationCode', 'standardHours',
        'description.1', 'type',
        'description.2', 'isDamageCausal', 'manufacturer', 'partNumber', 'quantity', 'serialNumber', 'unit',
        'company', 'description.3', 'invoiceCode', 'invoiceDate', 'invoiceNumber'
    ]].drop_duplicates().groupby('orderNumber')

    for order in orders:
        order['vehicle'] = orders_vehicle.get_group(order['orderNumber']).to_dict('records')[0]
        order['vehicle']['nextMotDueDate'] = date_format(order['vehicle']['nextMotDueDate'])

        order['orderDate'] = date_format(order['orderDate'])
        order['orderCompletionDate'] = date_format(order['orderCompletionDate'])
        order['vehicleIntakeDate'] = date_format(order['vehicleIntakeDate'])

        items = orders_items.get_group(order['orderNumber']).to_dict('records')
        order['items'] = []
        for item in items:
            order['items'].append({
                'lineNumber': item['lineNumber'],
                'operation': {
                    'category': item['category'],
                    'description': item['description'],
                    'hours': item['hours'],
                    'operationCode': item['operationCode'],
                    'standardHours': item['standardHours']
                },
                'other': {
                    'description': item['description.1'],
                    'type': item['type']
                },
                'part': {
                    'description': item['description.2'],
                    'isDamageCausal': item['isDamageCausal'],
                    'manufacturer': item['manufacturer'],
                    'partNumber': item['partNumber'],
                    'quantity': item['quantity'],
                    'serialNumber': item['serialNumber'],
                    'unit': item['unit']
                },
                'purchaseInvoice': {
                    'company': item['company'],
                    'description': item['description.3'],
                    'invoiceCode': item['invoiceCode'],
                    'invoiceDate': date_format(item['invoiceDate']),
                    'invoiceNumber': item['invoiceNumber']
                }
            })

    date_min = str(df['invoiceDate'].min()) + 'T00:00:00.000Z'
    date_max = str(df['invoiceDate'].max()) + 'T00:00:00.000Z'

    res = {
        'creationDate': str(datetime.now()),
        'invoices': invoices,
        'orders': orders,
        'timeRangeBegin': date_min,
        'timeRangeEnd': date_max
    }

    json.dump(res, open(json_file, 'w'), indent=2)
    return res


def upload(data):
    headers = {
        'accept': 'application/vnd.mazdaeur.dms.v3+json',
        'x-mme-organisation': dealer_number,
        'X-mazda-org': dealer_number,
        'Content-Type': 'application/json',
        # 'Authorization': 'Bearer ' + token
    }

    client = BackendApplicationClient(client_id=client_id)
    oauth = OAuth2Session(client=client)
    authorization_url, state = oauth.authorization_url(auth_url)
    print('Please go here and authorize: ' + authorization_url)
    redirect_response = input('Paste the full redirect URL here:')

    token = oauth.fetch_token(token_url=auth_url, client_id=client_id, client_secret=api_key, authorization_response=redirect_response)

    s = requests.Session()
    s.auth = (user, password)
    s.headers.update(headers)
    # r = s.post(webservice + module, data=data)
    r = s.get(auth_url + '?response_type=code&client_id=globalcube&state=xyz&scope=write', token)
    print(r.text)
    r = s.post(token_url, data={'grant_type': 'authorization_code', 'code': ''})
    print(r.text)


def main():
    # data = convert_csv('nasa/Workshop_Order_Report.csv', 'nasa/mazda_export.json')
    data = json.load(open('nasa/mazda_export.json', 'r'))
    upload(data)


if __name__ == '__main__':
    main()