import datetime
import json
from dataclasses import dataclass


@dataclass
class User:
    username: str
    last_login: datetime.datetime


def generate_latest_login_report(users, output_format):
    if output_format == "JSON":
        return json.dumps(
            [
                {"username": user.username, "last_login": user.last_login.isoformat()}
                for user in users
            ]
        )
    elif output_format == "CSV":
        return "\n".join(
            f"{user.username}, {user.last_login.isoformat()}" for user in users
        )
    else:
        return ";".join(
            f"{user.username} {user.last_login.isoformat()}" for user in users
        )


# with strategy
def generate_latest_login_report_json(users):
    return json.dumps(
        [
            {"username": user.username, "last_login": user.last_login.isoformat()}
            for user in users
        ]
    )


def generate_latest_login_report_csv(users):
    return "\n".join(
        f"{user.username}, {user.last_login.isoformat()}" for user in users
    )


def generate_latest_login_report_default_text(users):
    return ";".join(f"{user.username} {user.last_login.isoformat()}" for user in users)


report_generators = {
    "JSON": generate_latest_login_report_json,
    "CSV": generate_latest_login_report_csv,
}


def generate_latest_login_report(users, outputFormat):
    report_generator = report_generators.get(
        outputFormat, generate_latest_login_report_default_text
    )
    return report_generator(users)


users = [
    User(username="johndoe", last_login=datetime.datetime(2021, 8, 7)),
    User(username="janedoe", last_login=datetime.datetime(2021, 4, 3)),
]

print(generate_latest_login_report(users, "JSON"))

# multi-parameter selection
@dataclass
class User:
    name: str
    country: str
    role: str


def us_admin(name):
    return f"Hello, Admin {name}"


def us_user(name):
    return f"Hello, {name}"


def it_admin(name):
    return f"Buongiorno, Admin {name}"


def default(name):
    return f"Hi, {name}"


greetings = {
    ("US", "Admin"): us_admin,
    ("US", "User"): us_user,
    ("IT", "Admin"): it_admin,
}


def say_greeting(user):
    greeting = greetings.get((user.country, user.role), default)
    return greeting(user.name)


print(say_greeting(User(name="John", country="IT", role="Admin")))
