import logging

import stripe

logger = logging.getLogger(__name__)


def expand_name(first_name, last_name):
    """
    Convert two name variables into one.
    Last name without a first name is ignored.
    """
    name = None
    if first_name:
        name = first_name
        # We only want to put the last name if we have a first name
        if last_name:
            name += f" {last_name}"
    return name


def get_or_create(email, first_name, last_name):
    """
    Get a customer ID from Stripe if one with the given email exists.
    Create a customer if one does not.
    Raise an exception if two or more customers matching the given email exist.
    """
    # Let's see if we're just missing the ID
    matching_customers = stripe.Customer.list(email=email, limit=2)
    if len(matching_customers) == 2:
        # Something is horribly wrong
        logger.error(f"Two customers found for email {email}")
        raise Exception(f"Two customers found for email {email}")

    elif len(matching_customers) == 1:
        # We found a customer. Let's copy the ID
        customer = matching_customers["data"][0]
        customer_id = customer["id"]
        return customer_id

    else:
        # We didn't find anything. Create the customer

        # Create a name, since we have 2 variables which could be null
        name = expand_name(first_name, last_name)
        cast = {"email": email}
        if name:
            cast["name"] = name
        customer = stripe.Customer.create(**cast)
        logger.info(f"Created new Stripe customer {customer.id} with email {email}")

        return customer.id


def update_customer_fields(stripe_id, email=None, first_name=None, last_name=None):
    """
    Update the customer fields in Stripe.
    """
    if email:
        stripe.Customer.modify(stripe_id, email=email)
        logger.info(f"Modified Stripe customer {stripe_id} to have email {email}")
    if first_name or last_name:
        name = expand_name(first_name, last_name)
        stripe.Customer.modify(stripe_id, name=name)
        logger.info(f"Modified Stripe customer {stripe_id} to have email {name}")
