import random
import os
import time
import sqlite3

# ============================================
# CLASS CHARACTER
# ============================================
class Character:
    def __init__(self, name):
        self.name = name
        self.hp = 100
        self.max_hp = 100
        self.mana = 50
        self.max_mana = 50
        self.coins = random.randint(500, 1500)
        self.house = None
        self.wand = None
        self.inventory = []
        self.spells = []
        self.attack_bonus = 0
        self.potion_multiplier = 1.0

    def show_status(self):
        print("")
        print("=" * 50)
        print("  Vaziyat " + self.name + ":")
        print("  Khaneh: " + (self.house.name if self.house else "Nadarad"))
        print("  HP: " + str(self.hp) + "/" + str(self.max_hp))
        print("  Mana: " + str(self.mana) + "/" + str(self.max_mana))
        print("  Coins: " + str(self.coins))
        if self.wand:
            print("  Choob-e Dasti: " + self.wand.name + " (+" + str(self.wand.attack_bonus) + " attack)")
        else:
            print("  Choob-e Dasti: Nadarad")
        if self.inventory:
            print("  Majoon haye kif:")
            for p in self.inventory:
                print("    - " + p.name + " (bargardani " + str(p.restore_amount) + " " + p.effect + ")")
        else:
            print("  Majoon haye kif: Khali")
        print("=" * 50)


# ============================================
# CLASS HOUSE
# ============================================
class House:
    def __init__(self, name, bonus_text, bonus_type):
        self.name = name
        self.bonus_text = bonus_text
        self.bonus_type = bonus_type

    def apply_bonus(self, player):
        pass


class Gryffindor(House):
    def __init__(self):
        super().__init__("Gryffindor", "+30 HP", "hp")
    def apply_bonus(self, player):
        old_hp = player.max_hp
        player.max_hp += 30
        player.hp = player.max_hp
        added = player.max_hp - old_hp
        print("  Gryffindor! \033[92m+" + str(added) + " HP\033[0m ezafe shod! (HP: " + str(player.hp) + ")")


class Slytherin(House):
    def __init__(self):
        super().__init__("Slytherin", "+5 attack damage", "damage")
    def apply_bonus(self, player):
        player.attack_bonus += 5
        print("  Slytherin! \033[92m+5 attack damage\033[0m ezafe shod! (be spell ha ezafe mishe)")


class Ravenclaw(House):
    def __init__(self):
        super().__init__("Ravenclaw", "+20 Mana", "mana")
    def apply_bonus(self, player):
        old_mana = player.max_mana
        player.max_mana += 20
        player.mana = player.max_mana
        added = player.max_mana - old_mana
        print("  Ravenclaw! \033[92m+" + str(added) + " Mana\033[0m ezafe shod! (Mana: " + str(player.mana) + ")")


class Hufflepuff(House):
    def __init__(self):
        super().__init__("Hufflepuff", "Potion ha 20% moaser tar", "potion")
    def apply_bonus(self, player):
        player.potion_multiplier = 1.2
        print("  Hufflepuff! \033[92mPotion ha 20% moaser tar\033[0m shod! (vaqti potion mikhori ezafe mishe)")


# ============================================
# CLASS WAND
# ============================================
class Wand:
    def __init__(self, name, attack_bonus, price):
        self.name = name
        self.attack_bonus = attack_bonus
        self.price = price


# ============================================
# CLASS POTION
# ============================================
class Potion:
    def __init__(self, name, effect, restore_amount, price):
        self.name = name
        self.effect = effect
        self.restore_amount = restore_amount
        self.price = price


# ============================================
# CLASS SPELL
# ============================================
class Spell:
    def __init__(self, name, damage, mana_cost):
        self.name = name
        self.damage = damage
        self.mana_cost = mana_cost


# ============================================
# CLASS ENEMY
# ============================================
class Enemy:
    def __init__(self, name, hp, damage, emoji):
        self.name = name
        self.hp = hp
        self.max_hp = hp
        self.damage = damage
        self.emoji = emoji


# ============================================
# CLASS SHOP
# ============================================
class Shop:
    def __init__(self):
        self.wands = [
            Wand("Choob-e Asa", 15, 300),
            Wand("Choob-e Simorgh", 10, 200),
            Wand("Choob-e Tak Shakh", 7, 150)
        ]
        self.potions = [
            Potion("Majoon-e Shafa", "heal", 25, 50),
            Potion("Majoon-e Mana", "mana", 20, 40),
            Potion("Majoon-e Beynalmelali", "heal", 50, 90)
        ]

    def show_wands(self):
        print("")
        print("  --- Choob-e Dasti haye mojood ---")
        for i in range(len(self.wands)):
            w = self.wands[i]
            print("  " + str(i+1) + ". " + w.name + " | Attack Bonus: +" + str(w.attack_bonus) + " | Gheymat: " + str(w.price) + " coins")

    def show_potions(self):
        print("")
        print("  --- Majoon haye mojood ---")
        for i in range(len(self.potions)):
            p = self.potions[i]
            print("  " + str(i+1) + ". " + p.name + " | Bargardani: " + str(p.restore_amount) + " " + p.effect + " | Gheymat: " + str(p.price) + " coins")

    def buy_wand(self, player):
        self.show_wands()
        try:
            choice = int(input("\n  Kodom ro mikhay? (0 = bargasht): "))
            if choice == 0:
                return
            if 1 <= choice <= len(self.wands):
                wand = self.wands[choice - 1]
                if player.coins >= wand.price:
                    player.coins -= wand.price
                    player.wand = wand
                    print("\n  >> " + wand.name + " ro kharidi! (+" + str(wand.attack_bonus) + " attack ezafe)")
                else:
                    print("\n  >> Coins kafi nist!")
            else:
                print("\n  Shomare eshtebah!")
        except:
            print("\n  Lotfan adad vared kon!")

    def buy_potion(self, player):
        self.show_potions()
        try:
            choice = int(input("\n  Kodom ro mikhay? (0 = bargasht): "))
            if choice == 0:
                return
            if 1 <= choice <= len(self.potions):
                p = self.potions[choice - 1]
                if player.coins >= p.price:
                    player.coins -= p.price
                    new_p = Potion(p.name, p.effect, p.restore_amount, p.price)
                    player.inventory.append(new_p)
                    print("\n  >> " + p.name + " ro kharidi!")
                else:
                    print("\n  >> Coins kafi nist!")
            else:
                print("\n  Shomare eshtebah!")
        except:
            print("\n  Lotfan adad vared kon!")

    def enter(self, player):
        print("")
        print("\033[96m" + "=" * 55 + "\033[0m")
        print("\033[96m  Khosh amadi be Bazar-e Jadoogari (Koche Diagon)!\033[0m")
        print("\033[96m" + "=" * 55 + "\033[0m")
        print("\n  Inja mitoni Choob-e Dasti va Majoon bekhar:")

        while True:
            print("")
            print("  1. Kharide Choob-e Dasti")
            print("  2. Kharide Majoon")
            print("  3. Khorooj")
            try:
                option = int(input("  Chikar koni? (1-3): "))
                if option == 1:
                    self.buy_wand(player)
                elif option == 2:
                    self.buy_potion(player)
                elif option == 3:
                    print("\n  Az Bazar-e Jadoogari kharej shodi!")
                    break
                else:
                    print("\n  Eshtebah!")
            except:
                print("\n  Lotfan adad vared kon!")


# ============================================
# CLASS MOBAREZE
# ============================================
class Battle:
    def __init__(self, player, enemy):
        self.player = player
        self.enemy = enemy
        self.round_number = 0

    def make_hp_bar(self, current, maximum):
        bar_len = 20
        filled = int(bar_len * current / maximum)
        if filled < 0:
            filled = 0
        bar = "█" * filled + "░" * (bar_len - filled)
        return bar

    def show_battle(self):
        print("")
        print("\033[93m" + "█" * 55 + "\033[0m")
        print("\033[93m  " + self.player.name + "  VS  " + self.enemy.name + " " + self.enemy.emoji + "\033[0m")
        print("\033[93m" + "█" * 55 + "\033[0m")
        
        hp_bar_player = self.make_hp_bar(self.player.hp, self.player.max_hp)
        print("  " + self.player.name + "  HP [" + hp_bar_player + "] " + str(self.player.hp) + "/" + str(self.player.max_hp))
        print("  Mana: " + str(self.player.mana) + "/" + str(self.player.max_mana))
        
        enemy_hp_bar = self.make_hp_bar(self.enemy.hp, self.enemy.max_hp)
        print("  " + self.enemy.name + " " + self.enemy.emoji + " HP [" + enemy_hp_bar + "] " + str(self.enemy.hp) + "/" + str(self.enemy.max_hp))
        print("\033[90m" + "─" * 55 + "\033[0m")

    def use_spell(self):
        if not self.player.spells:
            print("\n  Verd-e Jadooi nadari!")
            return

        print("")
        print("  --- Verd-e Jadooi ---")
        
        print("  Khaneh: " + self.player.house.name)
        if self.player.house.bonus_type == "damage":
            print("  \033[92mBonus Khaneh: +" + str(self.player.attack_bonus) + " attack damage be spell ha ezafe mishe\033[0m")
        
        if self.player.wand:
            print("  Choob-e Dasti: " + self.player.wand.name + " (+" + str(self.player.wand.attack_bonus) + " damage)")
        print("")
        
        for i in range(len(self.player.spells)):
            s = self.player.spells[i]
            wand_bonus = self.player.wand.attack_bonus if self.player.wand else 0
            house_bonus = self.player.attack_bonus
            total_dmg = s.damage + wand_bonus + house_bonus
            can = "[OK]" if self.player.mana >= s.mana_cost else "[Mana nist]"
            
            dmg_text = str(s.damage) + " (asli)"
            if wand_bonus > 0:
                dmg_text += " + \033[92m" + str(wand_bonus) + " (wand)\033[0m"
            if house_bonus > 0:
                dmg_text += " + \033[92m" + str(house_bonus) + " (" + self.player.house.name + ")\033[0m"
            if wand_bonus > 0 or house_bonus > 0:
                dmg_text += " = \033[93m" + str(total_dmg) + "\033[0m"
            
            print("  " + str(i+1) + ". " + s.name + " | Damage: " + dmg_text + " | Mana: " + str(s.mana_cost) + " " + can)

        try:
            choice = int(input("\n  Kodom Verd? (0 = bargasht): "))
            if choice == 0:
                return
            if 1 <= choice <= len(self.player.spells):
                spell = self.player.spells[choice - 1]
                if self.player.mana >= spell.mana_cost:
                    self.player.mana -= spell.mana_cost
                    
                    wand_bonus = self.player.wand.attack_bonus if self.player.wand else 0
                    house_bonus = self.player.attack_bonus
                    total_dmg = spell.damage + wand_bonus + house_bonus
                    
                    self.enemy.hp -= total_dmg
                    if self.enemy.hp < 0:
                        self.enemy.hp = 0
                    
                    print("\n  " + spell.name + "! " + str(spell.damage) + " (asli)", end="")
                    if wand_bonus > 0:
                        print(" + \033[92m" + str(wand_bonus) + " (wand)\033[0m", end="")
                    if house_bonus > 0:
                        print(" + \033[92m" + str(house_bonus) + " (" + self.player.house.name + ")\033[0m", end="")
                    print(" = \033[93m" + str(total_dmg) + "\033[0m asiib be " + self.enemy.name + " " + self.enemy.emoji + " zad! (-" + str(spell.mana_cost) + " Mana)")
                else:
                    print("\n  Mana kafi nist!")
            else:
                print("\n  Shomare eshtebah!")
        except:
            print("\n  Lotfan adad vared kon!")

    def use_potion(self):
        if not self.player.inventory:
            print("\n  Majoon nadari!")
            return

        print("")
        print("  --- Majoon haye kif ---")
        print("  Khaneh: " + self.player.house.name)
        if self.player.house.bonus_type == "potion":
            print("  \033[92mBonus Khaneh: Potion ha 20% moaser tar hastan\033[0m")
        print("")
        
        for i in range(len(self.player.inventory)):
            p = self.player.inventory[i]
            if self.player.house.bonus_type == "potion":
                boosted = int(p.restore_amount * 1.2)
                extra = boosted - p.restore_amount
                print("  " + str(i+1) + ". " + p.name + " (+" + str(p.restore_amount) + " " + p.effect + " asli + \033[92m" + str(extra) + " (Hufflepuff)\033[0m = \033[93m" + str(boosted) + "\033[0m)")
            else:
                print("  " + str(i+1) + ". " + p.name + " (+" + str(p.restore_amount) + " " + p.effect + ")")

        try:
            choice = int(input("\n  Kodom Majoon? (0 = bargasht): "))
            if choice == 0:
                return
            if 1 <= choice <= len(self.player.inventory):
                potion = self.player.inventory.pop(choice - 1)
                base_amount = potion.restore_amount
                amount = int(base_amount * self.player.potion_multiplier)
                extra = amount - base_amount

                if potion.effect == "heal":
                    old_hp = self.player.hp
                    self.player.hp = min(self.player.max_hp, self.player.hp + amount)
                    healed = self.player.hp - old_hp
                    print("\n  " + potion.name + "! +" + str(base_amount) + " (asli)", end="")
                    if extra > 0:
                        print(" + \033[92m" + str(extra) + " (Hufflepuff)\033[0m", end="")
                    print(" = \033[93m" + str(healed) + " HP\033[0m")

                elif potion.effect == "mana":
                    old_mana = self.player.mana
                    self.player.mana = min(self.player.max_mana, self.player.mana + amount)
                    gained = self.player.mana - old_mana
                    print("\n  " + potion.name + "! +" + str(base_amount) + " (asli)", end="")
                    if extra > 0:
                        print(" + \033[92m" + str(extra) + " (Hufflepuff)\033[0m", end="")
                    print(" = \033[93m" + str(gained) + " Mana\033[0m")

            else:
                print("\n  Shomare eshtebah!")
        except:
            print("\n  Lotfan adad vared kon!")

    def enemy_turn(self):
        if self.enemy.hp > 0:
            self.player.hp -= self.enemy.damage
            if self.player.hp < 0:
                self.player.hp = 0
            print("  " + self.enemy.name + " " + self.enemy.emoji + " be to hamle kard! " + str(self.enemy.damage) + " asiib khordi!")

    def start(self):
        print("")
        print("\033[91m" + "█" * 55 + "\033[0m")
        print("\033[91m  MOBAREZE BA " + self.enemy.name.upper() + " " + self.enemy.emoji + "\033[0m")
        print("\033[91m" + "█" * 55 + "\033[0m")

        while self.player.hp > 0 and self.enemy.hp > 0:
            self.round_number += 1
            print("\n\033[93m  --- MARHALE " + str(self.round_number) + " ---\033[0m")
            
            self.show_battle()

            print("  1. Verd-e Jadooi")
            print("  2. Majoon")
            print("  3. Vaziyat")

            try:
                action = int(input("  Chikar koni? (1-3): "))
                if action == 1:
                    self.use_spell()
                elif action == 2:
                    self.use_potion()
                elif action == 3:
                    self.player.show_status()
                    self.round_number -= 1
                    continue
                else:
                    print("\n  Eshtebah!")
                    self.round_number -= 1
                    continue
                self.enemy_turn()
            except:
                print("\n  Lotfan adad vared kon!")
                self.round_number -= 1

        print("")
        print("\033[93m" + "█" * 55 + "\033[0m")
        if self.player.hp <= 0:
            print("\033[91m  DEFEAT! Shekast khordi...\033[0m")
            return "Defeat"
        else:
            print("\033[92m  VICTORY! Pirouz shodi!\033[0m")
            return "Victory"


# ============================================
# DATABASE FUNCTIONS
# ============================================

def create_database():
    conn = sqlite3.connect("hogwarts.db")
    cursor = conn.cursor()

    cursor.execute("""
    CREATE TABLE IF NOT EXISTS players(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT UNIQUE,
        house TEXT,
        hp INTEGER,
        max_hp INTEGER,
        mana INTEGER,
        max_mana INTEGER,
        coins INTEGER,
        wand TEXT,
        attack_bonus INTEGER,
        potion_multiplier REAL
    )
    """)

    cursor.execute("""
    CREATE TABLE IF NOT EXISTS inventory(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        player_name TEXT,
        potion_name TEXT,
        effect TEXT,
        restore_amount INTEGER,
        price INTEGER
    )
    """)

    cursor.execute("""
    CREATE TABLE IF NOT EXISTS battle_history(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        player_name TEXT,
        enemy_name TEXT,
        result TEXT
    )
    """)

    conn.commit()
    conn.close()


def save_player(player):
    conn = sqlite3.connect("hogwarts.db")
    cursor = conn.cursor()

    wand_name = player.wand.name if player.wand else ""

    cursor.execute("""
    INSERT OR REPLACE INTO players
    (name, house, hp, max_hp, mana, max_mana, coins, wand, attack_bonus, potion_multiplier)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    """, (
        player.name,
        player.house.name,
        player.hp,
        player.max_hp,
        player.mana,
        player.max_mana,
        player.coins,
        wand_name,
        player.attack_bonus,
        player.potion_multiplier
    ))

    cursor.execute("DELETE FROM inventory WHERE player_name=?", (player.name,))

    for potion in player.inventory:
        cursor.execute("""
        INSERT INTO inventory
        (player_name, potion_name, effect, restore_amount, price)
        VALUES (?, ?, ?, ?, ?)
        """, (
            player.name,
            potion.name,
            potion.effect,
            potion.restore_amount,
            potion.price
        ))

    conn.commit()
    conn.close()


def save_battle(player_name, enemy_name, result):
    conn = sqlite3.connect("hogwarts.db")
    cursor = conn.cursor()
    cursor.execute("""
    INSERT INTO battle_history
    (player_name, enemy_name, result)
    VALUES (?, ?, ?)
    """, (player_name, enemy_name, result))
    conn.commit()
    conn.close()


def load_player(name):
    conn = sqlite3.connect("hogwarts.db")
    cursor = conn.cursor()

    cursor.execute("SELECT * FROM players WHERE name=?", (name,))
    row = cursor.fetchone()

    if row is None:
        conn.close()
        return None

    player = Character(row[1])
    player.hp = row[3]
    player.max_hp = row[4]
    player.mana = row[5]
    player.max_mana = row[6]
    player.coins = row[7]
    player.attack_bonus = row[9]
    player.potion_multiplier = row[10]

    house_name = row[2]
    if house_name == "Gryffindor":
        player.house = Gryffindor()
    elif house_name == "Slytherin":
        player.house = Slytherin()
    elif house_name == "Ravenclaw":
        player.house = Ravenclaw()
    elif house_name == "Hufflepuff":
        player.house = Hufflepuff()

    cursor.execute("""
    SELECT potion_name, effect, restore_amount, price
    FROM inventory WHERE player_name=?
    """, (name,))
    potions = cursor.fetchall()
    for p in potions:
        player.inventory.append(Potion(p[0], p[1], p[2], p[3]))

    conn.close()
    return player


def give_spells(player):
    player.spells = [
        Spell("Expelliarmus", 15, 10),
        Spell("Stupefy", 20, 15),
        Spell("Sectumsempra", 30, 25),
        Spell("Bombarda", 25, 20),
        Spell("Avada Kedavra", 50, 40)
    ]


# ============================================
# GAME
# ============================================

def clear():
    os.system('cls' if os.name == 'nt' else 'clear')

def loading(text, seconds=2):
    print("")
    print("  " + text, end="")
    for _ in range(seconds * 4):
        time.sleep(0.25)
        print(".", end="", flush=True)
    print("")

def new_game():
    clear()
    print("")
    print("\033[95m" + "*" * 55 + "\033[0m")
    print("\033[95m  WELCOME TO HARRY POTTER WORLD!\033[0m")
    print("\033[95m" + "*" * 55 + "\033[0m")

    name = input("\n  Esm-e character ro vared kon: ")
    player = Character(name)
    print("\n  Salam " + player.name + "!")
    print("  Coins: " + str(player.coins))

    # Sorting Hat
    print("")
    print("\033[94m" + "=" * 55 + "\033[0m")
    print("\033[94m  MARHALE 1: KOLAHE TASMIM GIRI\033[0m")
    print("\033[94m" + "=" * 55 + "\033[0m")
    print("\n  Khaneh ha va bonus hashon:")
    print("  - Gryffindor : \033[92m+30 HP\033[0m")
    print("  - Slytherin  : \033[92m+5 attack damage\033[0m (be spell ha ezafe mishe)")
    print("  - Ravenclaw  : \033[92m+20 Mana\033[0m")
    print("  - Hufflepuff : \033[92mPotion ha 20% moaser tar\033[0m (vaqti potion mikhori)")
    input("\n  Enter bezan...")

    houses = [Gryffindor(), Slytherin(), Ravenclaw(), Hufflepuff()]
    chosen_house = random.choice(houses)
    player.house = chosen_house
    loading("Kolahe Tasmim Giri dar hale barrasi")
    print("\n  >> Kolahe Tasmim Giri: " + chosen_house.name + "!")
    chosen_house.apply_bonus(player)
    input("\n  Enter bezan...")

    # Shop
    print("")
    print("\033[96m" + "=" * 55 + "\033[0m")
    print("\033[96m  MARHALE 2: BAZAR-E JADOOGARI (KOCHE DIAGON)\033[0m")
    print("\033[96m" + "=" * 55 + "\033[0m")
    shop = Shop()
    shop.enter(player)

    # Spells
    print("")
    print("\033[94m" + "=" * 55 + "\033[0m")
    print("\033[94m  MARHALE 3: YADGIRI VERD-E JADOOI HA\033[0m")
    print("\033[94m" + "=" * 55 + "\033[0m")
    give_spells(player)
    print("\n  5 Verd-e Jadooi yad gerefti:")
    for s in player.spells:
        print("  - " + s.name + " (Damage: " + str(s.damage) + ", Mana: " + str(s.mana_cost) + ")")
    player.show_status()

    # Enemy search
    print("")
    print("\033[95m" + "=" * 55 + "\033[0m")
    print("\033[95m  MARHALE 4: JOSTOJOYE DOSHMAN\033[0m")
    print("\033[95m" + "=" * 55 + "\033[0m")
    enemies = [
        Enemy("Dragon", 120, 18, "🐉"),
        Enemy("Dementor", 90, 14, "👻"),
        Enemy("Troll", 100, 12, "🧌"),
        Enemy("Basilisk", 110, 20, "🐍"),
        Enemy("Death Eater", 80, 15, "💀")
    ]

    while True:
        print("")
        print("  1. Jostojoye Doshman")
        print("  2. Bargasht be Bazar")
        try:
            option = int(input("  Chikar koni? (1-2): "))
            if option == 1:
                print("\n  Doshman haye mojood:")
                for e in enemies:
                    print("  - " + e.name + " " + e.emoji + " (HP: " + str(e.hp) + ", Damage: " + str(e.damage) + ")")
                loading("Dar hale jostojo")
                enemy = random.choice(enemies)
                print("\n  >> " + enemy.name + " " + enemy.emoji + " peyda shod!")
                input("\n  Enter bezan...")
                break
            elif option == 2:
                shop.enter(player)
                player.show_status()
            else:
                print("\n  Eshtebah!")
        except:
            print("\n  Lotfan adad vared kon!")

    # Battle
    print("")
    print("\033[91m" + "█" * 55 + "\033[0m")
    print("\033[91m  MARHALE 5: MOBAREZE\033[0m")
    print("\033[91m" + "█" * 55 + "\033[0m")
    battle = Battle(player, enemy)
    result = battle.start()

    # Save results
    save_battle(player.name, enemy.name, result)
    save_player(player)

    print("")
    print("\033[95m" + "*" * 55 + "\033[0m")
    print("\033[95m  GAME OVER! Mamnoon ke bazi kardi!\033[0m")
    print("\033[95m" + "*" * 55 + "\033[0m")
    input("\n  Enter bezan bargard be menu...")

def load_game():
    clear()
    print("")
    print("\033[95m  LOAD GAME\033[0m")
    name = input("\n  Esm ro vared kon: ")
    player = load_player(name)
    if player is None:
        print("\n  Player ba in esm peyda nashod!")
        input("\n  Enter bezan...")
        return

    give_spells(player)
    print("\n  >> " + player.name + " bargasht!")
    player.show_status()

    shop = Shop()
    enemies = [
        Enemy("Dragon", 120, 18, "🐉"),
        Enemy("Dementor", 90, 14, "👻"),
        Enemy("Troll", 100, 12, "🧌"),
        Enemy("Basilisk", 110, 20, "🐍"),
        Enemy("Death Eater", 80, 15, "💀")
    ]

    while True:
        print("")
        print("  1. Bere Bazar (Diagon Alley)")
        print("  2. Jostojoye Doshman & Jang")
        print("  3. Save & Khorooj be Menu")
        try:
            opt = int(input("  Chikar koni? "))
            if opt == 1:
                shop.enter(player)
                player.show_status()
            elif opt == 2:
                # enemy search
                while True:
                    print("")
                    print("  1. Jostojoye Doshman")
                    print("  2. Bargasht")
                    try:
                        choice = int(input("  Chikar koni? "))
                        if choice == 1:
                            print("\n  Doshman haye mojood:")
                            for e in enemies:
                                print("  - " + e.name + " " + e.emoji + " (HP: " + str(e.hp) + ", Damage: " + str(e.damage) + ")")
                            loading("Dar hale jostojo")
                            enemy = random.choice(enemies)
                            print("\n  >> " + enemy.name + " " + enemy.emoji + " peyda shod!")
                            input("\n  Enter bezan...")
                            battle = Battle(player, enemy)
                            result = battle.start()
                            save_battle(player.name, enemy.name, result)
                            save_player(player)
                            break
                        elif choice == 2:
                            break
                        else:
                            print("  Eshtebah!")
                    except:
                        print("  Lotfan adad vared kon!")
            elif opt == 3:
                save_player(player)
                print("\n  Player save shod!")
                break
            else:
                print("  Eshtebah!")
        except:
            print("  Lotfan adad vared kon!")

# ============================================
# MAIN MENU
# ============================================

def main_menu():
    create_database()
    while True:
        clear()
        print("")
        print("\033[95m  HARRY POTTER WORLD\033[0m")
        print("  1. New Game")
        print("  2. Load Game")
        print("  3. Exit")
        try:
            choice = int(input("  Entekhab: "))
            if choice == 1:
                new_game()
            elif choice == 2:
                load_game()
            elif choice == 3:
                print("\n  Khodahafez!")
                break
            else:
                print("  Eshtebah!")
                input()
        except:
            print("  Lotfan adad vared kon!")
            input()

if __name__ == "__main__":
    main_menu()