# type: ignore
import random
import asyncio
from pyweb import pydom
from pyodide.http import pyfetch

player_team = []
opp_team = []
is_battling = False

TYPE_ADVANTAGES = {
    "water": ["fire"],
    "fire": ["grass"],
    "grass": ["water"],
    "electric": ["water"],
    "flying": ["ground"]
}

def log_message(text, style_class):
    log_box = pydom["#battle-log"][0]
    new_p = pydom.create("p")
    new_p.classes.append(f"log-{style_class}")
    new_p.html = text
    log_box.append(new_p)
    # FIX: Changed .js_element to ._js
    log_box._js.scrollTop = log_box._js.scrollHeight

async def fetch_pokemon_data(poke_id, team_type):
    try:
        response = await pyfetch(f"https://pokeapi.co/api/v2/pokemon/{poke_id}")
        if response.status == 200:
            data = await response.json()
            
            name = data["name"]
            base_hp = data["stats"][0]["base_stat"]
            base_attack = data["stats"][1]["base_stat"]
            
            poke_types = [t["type"]["name"] for t in data["types"]]
            
            stat_total = sum([s["base_stat"] for s in data["stats"]])
            is_evolved = stat_total > 420
            
            hp = base_hp * (2.5 if is_evolved else 1.8)
            attack = base_attack * (1.3 if is_evolved else 1.0)
            
            sprite = data["sprites"]["front_default"]
            if not sprite:
                sprite = f"https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/{poke_id}.png"
            
            return {
                "id": poke_id,
                "name": name,
                "max_hp": int(hp),
                "current_hp": int(hp),
                "attack": int(attack),
                "sprite": sprite,
                "type": team_type,
                "poke_types": poke_types,
                "is_evolved": is_evolved
            }
    except Exception as e:
        print(f"Error fetching data: {e}")
    return None

def render_card(poke, grid_id):
    grid = pydom[f"#{grid_id}"][0]
    card = pydom.create("div")
    card.classes.append("poke-card")
    card.id = f"{poke['type']}-{poke['id']}"
    
    evo_tag = "<span style='color:#ffcb05; font-size:10px;'>[Evolved]</span>" if poke["is_evolved"] else ""
    types_string = "/".join(poke["poke_types"]).upper()
    
    card.html = f"""
        <img src="{poke['sprite']}" alt="{poke['name']}">
        <div><strong>{poke['name']} {evo_tag}</strong></div>
        <div style="font-size:10px; color:#aaa; margin-bottom:4px;">{types_string}</div>
        <div>ATK: {poke['attack']}</div>
        <div class="hp-bar-bg">
            <div class="hp-bar-fill" id="hp-fill-{poke['type']}-{poke['id']}"></div>
        </div>
    """
    grid.append(card)

async def setup_teams(event):
    global player_team, opp_team
    # FIX: Changed .js_element.disabled to ._js.disabled
    pydom["#start-btn"][0]._js.disabled = True
    pydom["#battle-btn"][0]._js.disabled = True
    
    pydom["#player-grid"][0].html = ""
    pydom["#opp-grid"][0].html = ""
    log_message("Searching the grass for combatants...", "system")
    
    unique_ids = random.sample(range(1, 152), 12)
    player_ids = unique_ids[:6]
    opp_ids = unique_ids[6:]
    
    player_team = []
    opp_team = []
    
    for pid in player_ids:
        poke = await fetch_pokemon_data(pid, "player")
        if poke:
            player_team.append(poke)
            render_card(poke, "player-grid")
            
    for oid in opp_ids:
        poke = await fetch_pokemon_data(oid, "opp")
        if poke:
            opp_team.append(poke)
            render_card(poke, "opp-grid")

    pydom["#player-count"][0].html = "6"
    pydom["#opp-count"][0].html = "6"
    log_message("Lineups ready! Elements and evolution lines are mapped out.", "system")
    
    pydom["#start-btn"][0].html = "Reroll Teams"
    # FIX: Changed .js_element.disabled to ._js.disabled
    pydom["#start-btn"][0]._js.disabled = False
    pydom["#battle-btn"][0]._js.disabled = False

def calculate_modifier(attacker, defender):
    multiplier = 1.0
    log_notes = []
    
    for a_type in attacker["poke_types"]:
        for d_type in defender["poke_types"]:
            if a_type in TYPE_ADVANTAGES and d_type in TYPE_ADVANTAGES[a_type]:
                multiplier *= 1.5
                log_notes.append("It's super effective!")
                
    if "bug" in attacker["poke_types"]:
        if attacker["is_evolved"] and not defender["is_evolved"]:
            multiplier *= 1.5
            log_notes.append("Bug type evolution advantage active!")
            
    return multiplier, " ".join(log_notes)

def execute_attack(attacker, defender):
    variance = random.uniform(0.85, 1.0)
    base_dmg = attacker["attack"] * 0.4 * variance
    
    multiplier, note = calculate_modifier(attacker, defender)
    dmg = int(base_dmg * multiplier) + 5
    
    defender["current_hp"] = max(0, defender["current_hp"] - dmg)
    
    hp_pct = (defender["current_hp"] / defender["max_hp"]) * 100
    hp_bar = pydom[f"#hp-fill-{defender['type']}-{defender['id']}"][0]
    # FIX: Changed .js_element to ._js
    hp_bar._js.style.width = f"{hp_pct}%"
    
    style = "player" if attacker["type"] == "player" else "opp"
    
    msg = f"{attacker['name'].upper()} strikes {defender['name'].upper()} for {dmg} damage!"
    if note:
        msg += f" <span style='color: #ffcb05; font-weight:bold;'>({note})</span>"
        
    log_message(msg, style)

def handle_faint(poke):
    log_message(f"💥 {poke['name'].upper()} fainted!", "system")
    card = pydom[f"#{poke['type']}-{poke['id']}"][0]
    card.classes.append("fainted")
    
    alive_player = len([p for p in player_team if p["current_hp"] > 0])
    alive_opp = len([p for p in opp_team if p["current_hp"] > 0])
    pydom["#player-count"][0].html = str(alive_player)
    pydom["#opp-count"][0].html = str(alive_opp)

async def start_battle(event):
    global is_battling
    if is_battling: return
    is_battling = True
    # FIX: Changed .js_element.disabled to ._js.disabled
    pydom["#start-btn"][0]._js.disabled = True
    pydom["#battle-btn"][0]._js.disabled = True
    
    log_message("⚔️ THE RUNTIME MATCH ENGINE IS ACTIVE! ⚔️", "system")
    
    while any(p["current_hp"] > 0 for p in player_team) and any(o["current_hp"] > 0 for o in opp_team):
        attacker = next(p for p in player_team if p["current_hp"] > 0)
        defender = next(o for o in opp_team if o["current_hp"] > 0)
        
        if random.random() > 0.5:
            execute_attack(attacker, defender)
            if defender["current_hp"] <= 0:
                handle_faint(defender)
            
            if defender["current_hp"] > 0 and any(p["current_hp"] > 0 for p in player_team):
                execute_attack(defender, attacker)
                if attacker["current_hp"] <= 0:
                    handle_faint(attacker)
        else:
            execute_attack(defender, attacker)
            if attacker["current_hp"] <= 0:
                handle_faint(attacker)
            
            if attacker["current_hp"] > 0 and any(o["current_hp"] > 0 for o in opp_team):
                execute_attack(attacker, defender)
                if defender["current_hp"] <= 0:
                    handle_faint(defender)
                    
        await asyncio.sleep(1.2)
        
    if any(p["current_hp"] > 0 for p in player_team):
        log_message("🎉 BATTLE OVER: You outsmarted the opponent! 🎉", "system")
    else:
        log_message("💀 BATTLE OVER: Enemy team synergy won this round. 💀", "system")
        
    is_battling = False
    # FIX: Changed .js_element.disabled to ._js.disabled
    pydom["#start-btn"][0]._js.disabled = False