from typing import Any, Sequence
import datetime as _dt


from coota import generator as _g, toolkit as _tk


class TimeGenerator(_g.IntGenerator):
    def __init__(self, *default_args, **args):
        if "start" not in args:
            args["start"] = int(_dt.datetime.now().timestamp())
        elif isinstance(args["start"], str):
            args["start"] = int(_tk.parse_time(args["start"]).timestamp())
        elif isinstance(args["start"], _dt.datetime):
            args["start"] = int(args["start"].timestamp())
        if "stop" not in args:
            args["stop"] = int((_dt.datetime.now() + _dt.timedelta(days=365)).timestamp())
        elif isinstance(args["stop"], str):
            args["stop"] = int(_tk.parse_time(args["stop"]).timestamp())
        elif isinstance(args["stop"], _dt.datetime):
            args["stop"] = int(args["stop"].timestamp())
        super(TimeGenerator, self).__init__(*default_args, **args)

    def make(self, *args) -> Any:
        return _dt.datetime.utcfromtimestamp(self.choice())


class EmailGenerator(_g.StringGenerator):
    def source(self) -> Sequence:
        return _g.NUMBER_SET + _g.LETTER_SET + "."

    def make(self, *args) -> Any:
        domain = self.get_required_arg("domain")
        return f"%s@{domain}" % "".join(self.choices(args[0]))


class QQMailGenerator(EmailGenerator):
    def __init__(self, *default_args, **args):
        args["domain"] = "qq.com"
        super().__init__(*default_args, **args)

    def source(self) -> Sequence:
        return _g.NUMBER_SET


class NameGenerator(_g.Generator):
    def source(self) -> Sequence:
        return "Aaron", "Abel", "Abraham", "Adam", "Adrian", "Aidan", "Alva", "Alex", "Alexander", "Alan", "Albert", \
               "Alfred", "Andrew", "Andy", "Angus", "Anthony", "Apollo", "Arnold", "Arthur", "August", "Austin", \
               "Ben", "Benjamin", "Bert", "Benson", "Bill", "Billy", "Blake", "Bob", "Bobby", "Brad", "Brandon", \
               "Brant", "Brent", "Brian", "Bryan", "Brown", "Bruce", "Caleb", "Cameron", "Carl", "Carlos", "Cary", \
               "Caspar", "Caspar", "Charles", "Cheney", "Chris", "Christian", "Christopher", "Clark", "Cliff", "Cody", \
               "Cole", "Colin", "Cosmo", "Daniel", "Denny", "Darwin", "David", "Dennis", "Derek", "Dick", "Donald", \
               "Douglas", "Duke", "Dylan", "Eddie", "Edgar", "Edison", "Edmund", "Edward", "Edwin", "Elijah", \
               "Elliott", "Elvis", "Eric", "Ethan", "Eugene", "Evan", "Ford", "Francis", "Frank", "Franklin", "Fred", \
               "Gabriel", "Gaby", "Garfield", "Gary", "Gavin", "Geoffrey", "George", "Gino", "Glen", "Glendon", \
               "Hank", "Hardy", "Harrison", "Harry", "Hayden", "Henry", "Hilton", "Hugo", "Hunk", "Howard", "Henry", \
               "Ian", "Ivan", "Isaac", "Isaiah", "Jack", "Jackson", "Jacob", "James", "Jason", "Jay", "Jeffery", \
               "Jerome", "Jerry", "Jesse", "Jim", "Jimmy", "Joe", "John", "Johnny", "Jonathan", "Jordan", "Jose", \
               "Joseph", "Joshua", "Justin", "Keith", "Ken", "Kennedy", "Kenneth", "Kenny", "Kevin", "Kyle", "Lance", \
               "Larry", "Laurent", "Lawrence", "Leander", "Lee", "Leo", "Leonard", "Leopold", "Leslie", "Loren", \
               "Lori", "Lorin", "Louis", "Luke", "Marcus", "Marcy", "Mark", "Marks", "Mars", "Marshal", "Martin", \
               "Marvin", "Mason", "Matthew", "Max", "Michael", "Mickey", "Mike", "Nathan", "Nathaniel", "Neil", \
               "Nelson", "Nicholas", "Nick", "Noah", "Norman", "Oliver", "Oscar", "Owen", "Patrick", "Paul", "Peter", \
               "Philip", "Phoebe", "Quentin", "Randall", "Randolph", "Randy", "Ray", "Raymond", "Reed", "Rex", \
               "Richard", "Richie", "Riley", "Robert", "Robin", "Robinson", "Rock", "Roger", "Ronald", "Rowan", "Roy", \
               "Ryan", "Sam", "Sammy", "Samuel", "Scott", "Sean", "Shawn", "Sidney", "Simon", "Solomon", "Spark", \
               "Spencer", "Spike", "Stanley", "Steve", "Steven", "Stewart", "Stuart", "Taylor", "Terence", "Terry", \
               "Ted", "Tim", "Timothy", "Todd", "Tommy", "Tom", "Thomas", "Tony", "Tyler", "Ulysses", "Van", "Vern", \
               "Vernon", "Victor", "Vincent", "Warner", "Warren", "Wayne", "Wesley", "William", "Willy", "Zack", \
               "Zachary", \
               "Abigail", "Abby", "Ada", "Adelaide", "Adeline", "Alexandra", "Ailsa", "Aimee", "Alexis", "Alice", \
               "Alicia", "Alina", "Allison", "Alyssa", "Amanda", "Amy", "Amber", "Anastasia", "Andrea", "Angel", \
               "Angela", "Angelia", "Angelina", "Ann", "Anna", "Anne", "Annie", "Anita", "Ariel", "April", "Ashley", \
               "Audrey", "Aviva", "Barbara", "Barbie", "Beata", "Beatrice", "Becky", "Bella", "Bess", "Bette", \
               "Betty", "Blanche", "Bonnie", "Brenda", "Brianna", "Britney", "Brittany", "Camille", "Candice", \
               "Candy", "Carina", "Carmen", "Carol", "Caroline", "Carry", "Carrie", "Cassandra", "Cassie", \
               "Catherine", "Cathy", "Chelsea", "Charlene", "Charlotte", "Cherry", "Cheryl", "Chloe", "Chris", \
               "Christina", "Christine", "Christy", "Cindy", "Claire", "Clair", "Claudia", "Clement", "Cloris", \
               "Connie", "Constance", "Cora", "Corrine", "Crystal", "Daisy", "Daphne", "Darcy", "Dave", "Debbie", \
               "Deborah", "Debra", "Demi", "Diana", "Dolores", "Donna", "Dora", "Doris", "Edith", "Editha", "Elaine", \
               "Eleanor", "Elizabeth", "Ella", "Ellen", "Ellie", "Emerald", "Emily", "Emma", "Enid", "Elsa", "Erica", \
               "Estelle", "Esther", "Eudora", "Eva", "Eve", "Evelyn", "Fannie", "Fay", "Fiona", "Flora", "Florence", \
               "Frances", "Frederica", "Frieda", "Gina", "Gillian", "Gladys", "Gloria", "Grace", "Greta", "Gwendolyn", \
               "Hannah", "Haley", "Hebe", "Helena", "Hellen", "Henna", "Heidi", "Hillary", "Ingrid", "Isabella", \
               "Irene", "Iris", "Ivy", "Jacqueline", "Jade", "Jamie", "Jane", "Janet", "Jasmine", "Jean", "Jenna", \
               "Jennifer", "Jenny", "Jessica", "Jessie", "Jill", "Joan", "Joanna", "Jocelyn", "Joliet", "Josephine", \
               "Josie", "Joy", "Joyce", "Judith", "Judy", "Julia", "Juliana", "Julie", "June", "Karen", "Katherine", \
               "Kate", "Kathy", "Katie", "Kate", "Katy", "Katrina", "Kay", "Kayla", "Kelly", "Kelsey", "Kimberly", \
               "Kitty", "Lassie", "Laura", "Lauren", "Lena", "Lydia", "Lillian", "Lily", "Linda", "Lindsay", "Lisa", \
               "Liz", "Lora", "Laura", "Lorraine", "Louisa", "Louise", "Lucia", "Lucy", "Lucine", "Lulu", "Lydia", \
               "Lynn", "Mabel", "Madeline", "Maggie", "Mamie", "Manda", "Mandy", "Margaret", "Mariah", "Marilyn", \
               "Martha", "Mavis", "Mary", "Matilda", "Maureen", "Mavis", "Maxine", "May", "Mayme", "Mayme", "Melinda", \
               "Melissa", "Melody", "Mercedes", "Meredith", "Mia", "Michelle", "Milly", "Miranda", "Miriam", "Miya", \
               "Molly", "Monica", "Morgan", "Nancy", "Natalie", "Natasha", "Nicole", "Nikita", "Nina", "Nora", \
               "Norma", "Nydia", "Octavia", "Olivia", "Ophelia", "Oprah", "Pamela", "Patricia", "Patty", "Paula", \
               "Pauline", "Pearl", "Peggy", "Philomena", "Phoebe", "Phyllis", "Polly", "Priscilla", "Rachel", \
               "Rebecca", "Regina", "Rita", "Rose", "Roxanne", "Ruth", "Sabrina", "Sally", "Sandra", "Samantha", \
               "Sami", "Sandra", "Sandy", "Sarah", "Sara", "Savannah", "Scarlett", "Selma", "Selina", "Serena", \
               "Sharon", "Sheila", "Shelley", "Shelly", "Sherry", "Shirley", "Sierra", "Silvia", "Sonia", "Sophia", \
               "Stacy", "Stella", "Stephanie", "Sue", "Sunny", "Susan", "Tamara", "Tammy", "Tanya", "Tasha", "Teresa", \
                "Tess", "Tiffany", "Tina", "Tonya", "Tracy", "Ursula", "Vanessa", "Venus", "Vera", "Vicky", \
               "Victoria", "Violet", "Virginia", "Vita", "Vivian", "Wanda", "Wendy", "Whitney", "Wynne", "Winnie", \
               "Yolanda", "Yvette", "Yvonne", "Zara", "Zelda", "Zoey", "Zoe", "Zora"

    def make(self, *args) -> Any:
        return self.choice()
