from datetime import datetime
import json
import os
from io import BytesIO
import boto3
from aws_lambda_powertools import Logger, Tracer
from aws_lambda_powertools.logging.correlation_paths import S3_OBJECT_LAMBDA
from openpyxl import load_workbook

logger = Logger()
tracer = Tracer()
s3 = boto3.resource('s3')


@logger.inject_lambda_context(correlation_id_path=S3_OBJECT_LAMBDA)
def lambda_handler(event, context):
    try:
        print(event)
        bucket = event["S3"]["Bucket"]
        key = event["S3"]["Key"]
        entities = parse_entities(bucket, key)
        result = []
        for entity in entities:

            if "/opportunity/" in key:
                uniqueid=entity["partnerCrmUniqueIdentifier"]
                result.append(build_ace_json(
                    opportunity=entity, name=uniqueid))
            if "/lead/" in key:
                #uniqueid=tbd
                result.append(build_ace_json(lead=entity))
        print(result)
    finally:
        delete_object_from_s3(bucket, key)
    return result


def build_ace_json(lead: dict = None, opportunity: dict = None, name: str = None):
    __doc__ = "Build Skeleton for ACE JSON for one given lead or opportunity"

    if lead and opportunity:
        raise Exception("You can't pass both a lead and an opportunity")

    event = {
        "version": "1",
        "spmsId": os.environ['PARTNER_ID'],
        "name": name
    }
    if lead:
        event["leads"] = [lead]
    elif opportunity:
        event['opportunities'] = [opportunity]
    json_event = json.dumps(event, cls=DateTimeEncoder)

    return json.loads(json_event)


def delete_object_from_s3(s3bucket, s3key):
    s3_client = boto3.client('s3')

    print("Purge file")

    response = s3_client.delete_object(
        Bucket=s3bucket,
        Key=s3key
    )
    print(response)
    return response


def parse_entities(bucket, key) -> list:
    s3_object = s3.Object(bucket, key)
    print("Reading Excel")
    print("Bucket:" + bucket)
    print("Key:" + key)
    content = s3_object.get()['Body'].read()
    print("Trying to process tab 'Target'")
    ws = load_workbook(BytesIO(content), data_only=True)[
        'Target']
    headers = {}
    for row in ws.iter_rows(max_row=1):
        for column in row:
            headers[column.column_letter] = column.value
    result = []
    for row in ws.iter_rows(min_row=4):
        input = {}
        for column in row:
            key_name = headers[column.column_letter]
            if column.value:
                input[key_name] = column.value
        if len(input) > 0:
            result.append(input)
    return result


class DateTimeEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, datetime):
            return o.strftime("%Y-%m-%d")

        return json.JSONEncoder.default(self, o)