# #!/usr/bin/env python3
# imports the global variables
import pet_variables
# imports the time library needed to delay certain functions
import time
# imports the random library needed to generate a random number for
# the guessing game
from random import randint
# imports the os library needed to clear the terminal
import os
# imports the pygame library needed to play the sound in the
# poking function
from pygame import mixer


# variables needed for the guessing game
secret = randint(1, 10)


### Functions providing the basic function of the programme ###

# a function which displays the pet's stats in a nice way.
def pet_stats():
    os.system('clear')
    print(pet_variables.pet_name)
    print(pet_variables.pet_photo)
    print("Status: " + pet_variables.pet_status)
    print("Age: " + str(pet_variables.pet_age))
    print("Health: " + pet_variables.pet_health * "♥")
    print("Hunger: " + pet_variables.pet_hunger * "*")
    print("Happines: " + pet_variables.pet_happiness * "☺")


# A function which checks if the pet is still alive
def is_alive():
    return pet_variables.pet_health > 0


# A function which let's the player choose his pet.
def beginning():
    print("Which pet do you want to look after?")
    print("1: Cat, 2: Mouse, 3: Fish, 4: Owl")
    chosen_pet = int(input("Choose your pet:"))
    if chosen_pet == 1:
        pet_variables.pet_photo = pet_variables.cat
    elif chosen_pet == 2:
        pet_variables.pet_photo = pet_variables.mouse
    elif chosen_pet == 3:
        pet_variables.pet_photo = pet_variables.fish
    elif chosen_pet == 4:
        pet_variables.pet_photo = pet_variables.owl
    pet_variables.pet_name = input("How do you want to call your pet?")


# A function which changes the status of the pet depending of the age value.
# Each status has it's own characteristics.

def set_youngling_stats():
    pet_variables.max_health = 10
    pet_variables.max_happiness = 8
    pet_variables.max_hunger = 7


def set_adult_stats():
    pet_variables.max_health = 10
    pet_variables.max_happiness = 8
    pet_variables.max_hunger = 7


def set_elderly_stats():
    pet_variables.max_health = 7
    pet_variables.max_happiness = 5
    pet_variables.max_hunger = 10


def reset_stats():
    pet_variables.pet_health = pet_variables.max_health
    pet_variables.pet_happiness = pet_variables.max_happiness
    pet_variables.pet_hunger = pet_variables.max_hunger


def aging():
    if pet_variables.pet_age == 5:
        pet_variables.pet_status = "adult"
        set_adult_stats()
        print("Congratulation your pet has become an adult. It needs less food now")
        print("and it's health has improved however it's grumpier than a youngling.")
    elif pet_variables.pet_age == 15:
        pet_variables.pet_status = "elderly"
        set_elderly_stats()
        print("Congratulation your pet has become an elderly it needs now less food.")
        print("However it's health is worse and it's grumpier than an adult.")


### Functions to increase and decrease stats ###

def increase_hunger():
    if pet_variables.pet_hunger < pet_variables.max_hunger:
        pet_variables.pet_hunger += 1


def increase_poke_count():
    pet_variables.poke_count += 1


def increase_happiness():
    if pet_variables.pet_happiness < pet_variables.max_happiness:
        pet_variables.pet_happiness += 1


def increase_health():
    if pet_variables.pet_health < pet_variables.max_health:
        pet_variables.pet_health += 1


def decrease_hunger():
    if pet_variables.pet_hunger > 0:
        pet_variables.pet_hunger -= 1


def decrease_happiness():
    if pet_variables.pet_happiness > 0:
        pet_variables.pet_happiness -= 1


def decrease_health():
    if pet_variables.pet_health > 0:
        pet_variables.pet_health -= 1


def decrease_poke_count():
    pet_variables.poke_count -= 1


# The function to decrease the stats and make the pet "live" needs to
# run in the background.
def decrease_stats():
    while True:
        time.sleep(pet_variables.day)
        decrease_hunger()
        if pet_variables.pet_hunger <= 0:
            decrease_health()
            decrease_happiness()


### Activities ###

# A function which simulates stroking it doesn't have any
# effect on the pet.
def stroking():
    os.system('clear')
    print()
    print("You're stroking the back of your pet gently.")
    print("It makes comforting noises and leans against your hand.")
    time.sleep(1)


# Increases the pets hungriness by +1 unless the hunger is bigger than
# the pet's maximum hunger. In this case the pet will vomit and looses hunger
# and health.
def feeding():
    os.system('clear')
    print("Hungriness of " + pet_variables.pet_name + ": " + pet_variables.pet_hunger * "*")
    feeding_confirmed = input("Do you want to feed your pet?")
    if feeding_confirmed in ("Y", "y"):
        increase_hunger()


# A simple guessing game which increases the pet's happiness
def playing():
    guess = 0
    os.system('clear')
    while guess != secret:
        g = input("Guess the Number")
        guess = int(g)
        if guess == secret:
            print("You win!")
        else:
            if guess > secret:
                print("Your guess is too high")
            else:
                print("Too low")
    increase_happiness()
    print("Game over!")


# let's you poke the pet and it will talk
# if you poke it more than 3 times it will get angry at you
def poking():
    os.system('clear')
    if pet_variables.poke_count < 3:
        print("You poke " + pet_variables.pet_name + " and it starts to speak.")
        increase_poke_count()
        mixer.init()
        mixer.music.load('happy.mp3')
        mixer.music.play()
        time.sleep(5)
    else:
        print("You annoyed " + pet_variables.pet_name + "." + " It got angry at you.")
        decrease_happiness()
        mixer.init()
        mixer.music.load('angry.mp3')
        mixer.music.play()
        time.sleep(3)


# A function which let's the pet sleep and regenerates it's stats
def sleeping():
    os.system('clear')
    print("Your pet is sleeping now.")
    time.sleep(10)
    if pet_variables.max_hunger / pet_variables.pet_hunger > 0.5:
        reset_stats()
        print("Your pet woke up feeling rested and in a good mood.")
    else:
        print("Your pet has woken up.")
    time.sleep(3)
