import random
import os

# ------------------------------------------------
# CHARACTER CLASS
# ------------------------------------------------
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("\n" + "═" * 50)
        print(f"  📜 {self.name} | Khaneh: {self.house.name if self.house else 'Nadarad'}")
        print("─" * 50)
        print(f"  ❤️  HP: {self.hp}/{self.max_hp}")
        print(f"  💎 Mana: {self.mana}/{self.max_mana}")
        print(f"  🪙 Coins: {self.coins}")
        wand_name = self.wand.name if self.wand else "Nadarad"
        print(f"  🪄 Wand: {wand_name}")
        if self.inventory:
            print(f"  🧪 Potion ha: {', '.join([p.name for p in self.inventory])}")
        else:
            print(f"  🧪 Potion ha: Khali")
        print("═" * 50)


# ------------------------------------------------
# HOUSE CLASSES
# ------------------------------------------------
class House:
    def __init__(self, name, bonus_desc):
        self.name = name
        self.bonus_desc = bonus_desc

    def apply_bonus(self, character):
        pass


class Gryffindor(House):
    def __init__(self):
        super().__init__("Gryffindor 🦁", "+30 HP")

    def apply_bonus(self, character):
        character.max_hp += 30
        character.hp = character.max_hp
        print(f"  🦁 Gryffindor! Shojat be to +30 HP ezafe mide! HP: {character.hp}")


class Slytherin(House):
    def __init__(self):
        super().__init__("Slytherin 🐍", "+5 Asiib")

    def apply_bonus(self, character):
        character.attack_bonus += 5
        print(f"  🐍 Slytherin! Hoshyari be to +5 asiib ezafe mide!")


class Ravenclaw(House):
    def __init__(self):
        super().__init__("Ravenclaw 🦅", "+20 Mana")

    def apply_bonus(self, character):
        character.max_mana += 20
        character.mana = character.max_mana
        print(f"  🦅 Ravenclaw! Danesh be to +20 Mana ezafe mide! Mana: {character.mana}")


class Hufflepuff(House):
    def __init__(self):
        super().__init__("Hufflepuff 🦡", "Potions 20% Mo'aser tar")

    def apply_bonus(self, character):
        character.potion_multiplier = 1.2
        print(f"  🦡 Hufflepuff! Sedaghat potion hayat ro 20% mo'aser tar mikone!")


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


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


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


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


# ------------------------------------------------
# SHOP CLASS
# ------------------------------------------------
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("Shafabakhsh ❤️", "heal", 25, 50),
            Potion("Mana Bakhsh 💎", "mana", 20, 40),
            Potion("Super Shafa ⭐", "heal", 50, 90)
        ]

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

    def show_wands(self):
        print("\n  ┌─────────────────────────────────────┐")
        print("  │         🪄  CHOOB HA  🪄           │")
        print("  ├────┬──────────────────┬─────────────┤")
        print("  │ #  │ Name             │ Gheymat     │")
        print("  ├────┼──────────────────┼─────────────┤")
        for i, w in enumerate(self.wands, 1):
            print(f"  │ {i}  │ {w.name:<16} │ {w.price:>4} 🪙    │")
        print("  └────┴──────────────────┴─────────────┘")

    def show_potions(self):
        print("\n  ┌──────────────────────────────────────────┐")
        print("  │            🧪  POTION HA  🧪            │")
        print("  ├────┬──────────────────┬────────┬─────────┤")
        print("  │ #  │ Name             │ Tavan  │ Gheymat │")
        print("  ├────┼──────────────────┼────────┼─────────┤")
        for i, p in enumerate(self.potions, 1):
            print(f"  │ {i}  │ {p.name:<16} │ {p.restore_amount:>2} {p.effect.upper():<3} │ {p.price:>4} 🪙 │")
        print("  └────┴──────────────────┴────────┴─────────┘")

    def buy_wand(self, character):
        self.show_wands()
        try:
            choice = int(input("\n  🛒 Kodom ro mikhai? (0 = bargasht): "))
            if choice == 0:
                return
            if 1 <= choice <= len(self.wands):
                wand = self.wands[choice - 1]
                if character.wand and character.wand.name == wand.name:
                    print("  ❌ Ino ghablan kharidi!")
                    return
                if character.coins >= wand.price:
                    character.coins -= wand.price
                    character.wand = wand
                    print(f"  ✅ {wand.name} kharide shod! Baghi mande: {character.coins} 🪙")
                else:
                    print("  ❌ Pool kafi nadari!")
            else:
                print("  ❌ Entekhab na motabar!")
        except ValueError:
            print("  ❌ Lotfan adad vared kon!")

    def buy_potion(self, character):
        self.show_potions()
        try:
            choice = int(input("\n  🛒 Kodom ro mikhai? (0 = bargasht): "))
            if choice == 0:
                return
            if 1 <= choice <= len(self.potions):
                potion = self.potions[choice - 1]
                if character.coins >= potion.price:
                    character.coins -= potion.price
                    new_potion = Potion(potion.name, potion.effect,
                                       potion.restore_amount, potion.price)
                    character.inventory.append(new_potion)
                    print(f"  ✅ {potion.name} kharide shod! Baghi mande: {character.coins} 🪙")
                else:
                    print("  ❌ Pool kafi nadari!")
            else:
                print("  ❌ Entekhab na motabar!")
        except ValueError:
            print("  ❌ Lotfan adad vared kon!")

    def enter_shop(self, character):
        print("\n" + "★" * 50)
        print("  🏪  Be DIAGON ALLEY khosh amadi!  🏪")
        print("★" * 50)
        while True:
            print("\n  ┌──────────────────────────┐")
            print("  │  1. 🪄  Kharid-e Wand    │")
            print("  │  2. 🧪  Kharid-e Potion  │")
            print("  │  3. 🚪  Khorooj          │")
            print("  └──────────────────────────┘")
            try:
                option = int(input("  🎯 Che kar konam?: "))
                if option == 1:
                    self.buy_wand(character)
                elif option == 2:
                    self.buy_potion(character)
                elif option == 3:
                    print("\n  👋 Az Diagon Alley kharej shodi!")
                    break
                else:
                    print("  ❌ Gozine eshtebah!")
            except ValueError:
                print("  ❌ Lotfan adad vared kon!")


# ------------------------------------------------
# BATTLE CLASS
# ------------------------------------------------
class Battle:
    def __init__(self, player, enemy):
        self.player = player
        self.enemy = enemy

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

    def show_battle_status(self):
        print("\n" + "█" * 55)
        print(f"  ⚔️  {self.player.name}  VS  {self.enemy.name}  ⚔️")
        print("█" * 55)
        
        # Player HP bar
        hp_percent = self.player.hp / self.player.max_hp
        bar_length = 20
        filled = int(bar_length * hp_percent)
        hp_bar = "█" * filled + "░" * (bar_length - filled)
        print(f"  👤 {self.player.name:<12} ❤️  [{hp_bar}] {self.player.hp}/{self.player.max_hp}")
        print(f"     💎 Mana: {self.player.mana}/{self.player.max_mana}")
        
        # Enemy HP bar
        enemy_percent = self.enemy.hp / 100
        if enemy_percent > 1:
            enemy_percent = 1
        filled_enemy = int(bar_length * enemy_percent)
        enemy_bar = "█" * filled_enemy + "░" * (bar_length - filled_enemy)
        print(f"  👹 {self.enemy.name:<12} ❤️  [{enemy_bar}] {self.enemy.hp}")
        print("─" * 55)

    def normal_attack(self):
        base_damage = 10
        wand_bonus = self.player.wand.attack_bonus if self.player.wand else 0
        total_damage = base_damage + wand_bonus + self.player.attack_bonus
        self.enemy.hp -= total_damage
        print(f"\n  ⚡ Be {self.enemy.name} hamle kardi! {total_damage} asiib zad!")
        if self.player.wand:
            print(f"  🪄 Choob daste komak kard!")

    def use_spell(self):
        if not self.player.spells:
            print("  ❌ Hich jadooi nadari!")
            return
        print("\n  ┌─────────────────────────────────────┐")
        print("  │         📜  JADOO HA  📜          │")
        print("  ├────┬──────────────────┬─────────────┤")
        print("  │ #  │ Name             │ Mana        │")
        print("  ├────┼──────────────────┼─────────────┤")
        for i, spell in enumerate(self.player.spells, 1):
            print(f"  │ {i}  │ {spell.name:<16} │ {spell.mana_cost:>3} 💎     │")
        print("  └────┴──────────────────┴─────────────┘")
        try:
            choice = int(input("  🎯 Kodom jadoo? (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
                    self.enemy.hp -= spell.damage
                    print(f"\n  ✨ {spell.name}!!! {spell.damage} asiib be {self.enemy.name} zad!")
                else:
                    print(f"  ❌ Mana kafi nist! {spell.mana_cost} 💎 niaz dari, {self.player.mana} 💎 dari!")
            else:
                print("  ❌ Entekhab na motabar!")
        except ValueError:
            print("  ❌ Lotfan adad vared kon!")

    def use_potion(self):
        if not self.player.inventory:
            print("  ❌ Kifet khaliye!")
            return
        print("\n  ┌──────────────────────────────────┐")
        print("  │      🧪  POTION HAYE TO  🧪     │")
        print("  ├────┬─────────────────────────────┤")
        print("  │ #  │ Name                        │")
        print("  ├────┼─────────────────────────────┤")
        for i, potion in enumerate(self.player.inventory, 1):
            print(f"  │ {i}  │ {potion.name:<27} │")
        print("  └────┴─────────────────────────────┘")
        try:
            choice = int(input("  🎯 Kodom ro estefade konam? (0 = bargasht): "))
            if choice == 0:
                return
            if 1 <= choice <= len(self.player.inventory):
                potion = self.player.inventory.pop(choice - 1)
                restore = int(potion.restore_amount * self.player.potion_multiplier)
                if potion.effect == "heal":
                    old_hp = self.player.hp
                    self.player.hp = min(self.player.max_hp, self.player.hp + restore)
                    healed = self.player.hp - old_hp
                    print(f"  🧪 {potion.name} estefade shod! +{healed} ❤️  | HP: {self.player.hp}/{self.player.max_hp}")
                elif potion.effect == "mana":
                    old_mana = self.player.mana
                    self.player.mana = min(self.player.max_mana, self.player.mana + restore)
                    gained = self.player.mana - old_mana
                    print(f"  🧪 {potion.name} estefade shod! +{gained} 💎 | Mana: {self.player.mana}/{self.player.max_mana}")
            else:
                print("  ❌ Entekhab na motabar!")
        except ValueError:
            print("  ❌ Lotfan adad vared kon!")

    def enemy_turn(self):
        if self.enemy.hp > 0:
            print(f"\n  👹 {self.enemy.name} be to hamle kard!")
            self.player.hp -= self.enemy.damage
            print(f"  💥 {self.enemy.damage} asiib khordi! HP to: {self.player.hp}/{self.player.max_hp}")

    def start(self):
        print("\n" + "🔥" * 55)
        print(f"  ⚔️  {self.enemy.name} be to hamle kard! Amade bash!  ⚔️")
        print("🔥" * 55)
        
        while self.player.hp > 0 and self.enemy.hp > 0:
            self.show_battle_status()
            print("\n  ┌────────────────────────────┐")
            print("  │  1. 📜 Jadoo              │")
            print("  │  2. ⚡ Hamle mamooli      │")
            print("  │  3. 🧪 Potion             │")
            print("  │  4. 📊 Vaziyat            │")
            print("  └────────────────────────────┘")
            
            try:
                action = int(input("  🎯 Che kar konam?: "))
                if action == 1:
                    self.use_spell()
                elif action == 2:
                    self.normal_attack()
                elif action == 3:
                    self.use_potion()
                elif action == 4:
                    self.player.show_status()
                    print(f"  👹 {self.enemy.name} HP: {self.enemy.hp}")
                    continue
                else:
                    print("  ❌ Gozine eshtebah!")
                    continue
                self.enemy_turn()
            except ValueError:
                print("  ❌ Lotfan adad vared kon!")

        # End of battle
        print("\n" + "═" * 55)
        if self.player.hp <= 0:
            print("  💀  SHEKAST KHORDI!  💀")
            print("  Too jang baz bakhti...")
        else:
            print("  🏆  PIROOZ SHODI!  🏆")
            print(f"  {self.enemy.name} ro shekast dadi!")
        print("═" * 55)
        self.player.show_status()


# ------------------------------------------------
# GAME CLASS
# ------------------------------------------------
class Game:
    def __init__(self):
        self.player = None

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

    def print_title(self):
        print("\n" + "✨" * 55)
        print("  ╔═══════════════════════════════════════════════╗")
        print("  ║        🧙‍♂️  HARRY POTTER WORLD  🧙‍♂️         ║")
        print("  ║         ~ Jadoo dar dastan tost ~            ║")
        print("  ╚═══════════════════════════════════════════════╝")
        print("✨" * 55)

    def create_spells(self):
        spells = [
            Spell("Expelliarmus ⚡", 15, 10),
            Spell("Stupefy 💫", 20, 15),
            Spell("Sectumsempra 🗡️", 30, 25),
            Spell("Bombarda 💣", 25, 20),
            Spell("Avada Kedavra 💀", 50, 40)
        ]
        return spells

    def create_enemies(self):
        enemies = [
            Enemy("Ejdeha 🐉", 120, 18),
            Enemy("Dementor 👻", 90, 14),
            Enemy("Ghol 🧌", 100, 12),
            Enemy("Basilisk 🐍", 110, 20),
            Enemy("Marg Khor 💀", 80, 15)
        ]
        return enemies

    def sorting_hat(self):
        houses = [Gryffindor(), Slytherin(), Ravenclaw(), Hufflepuff()]
        chosen = random.choice(houses)
        
        print("\n" + "🎩" * 25)
        print("  🎩  Sorting Hat dar hale entekhab...  🎩")
        print("🎩" * 25)
        
        # Dramatic pause effect
        import time
        for _ in range(3):
            print("  .", end="", flush=True)
            time.sleep(0.5)
        print(f"\n\n  ✨ Khaneh to: {chosen.name}! ✨")
        chosen.apply_bonus(self.player)
        self.player.house = chosen

    def start(self):
        self.clear_screen()
        self.print_title()
        
        print("\n  🎮  Be Harry Potter World khosh amadi!")
        print("  ─────────────────────────────────────")
        name = input("  ✏️  Esm-e khod ra vared kon: ")
        self.player = Character(name)
        
        print(f"\n  👋 Salam {self.player.name}!")
        print(f"  🪙 To ba {self.player.coins} coins shoroo mikoni!")
        input("\n  ↩️  Enter bezan edame bedi...")

        # House selection
        self.sorting_hat()
        input("\n  ↩️  Enter bezan edame bedi...")

        # Diagon Alley
        shop = Shop()
        shop.enter_shop(self.player)

        # Give spells
        self.player.spells = self.create_spells()
        print("\n" + "📜" * 30)
        print("  📜  To in jadoo ha ro yad gerefti:")
        print("  ─────────────────────────────────")
        for s in self.player.spells:
            print(f"  ✨ {s.name:<20} Asiib: {s.damage:>2} | Mana: {s.mana_cost:>2}")
        print("📜" * 30)
        input("\n  ↩️  Enter bezan edame bedi...")

        # Random enemy
        enemies = self.create_enemies()
        enemy = random.choice(enemies)

        # Start battle
        battle = Battle(self.player, enemy)
        battle.start()

        # Final
        print("\n" + "🌟" * 55)
        print("  🎮  Mamnoon ke bazi kardi! Dobare boro jadoogari!  🎮")
        print("🌟" * 55)


# ------------------------------------------------
# RUN GAME
# ------------------------------------------------
if __name__ == "__main__":
    game = Game()
    game.start()