import logging
from typing import Callable, Awaitable, List

from src.core.base import MigrationContext

logger = logging.getLogger(__name__)

async def sync_server_metadata(context: MigrationContext, progress_callback: Callable[[str, str], Awaitable[None]], components: List[str] = ["name", "icon", "banner"]) -> dict:
    """Syncs the server name, logo and banner. Returns a dict of cloned attributes."""
    metadata = await context.discord_reader.get_server_metadata()
    cloned_data = {}
    
    # 1. Sync Name
    if "name" in components:
        try:
            name = metadata.get("name")
            await context.writer.update_guild_metadata(name=name)
            cloned_data["name"] = name
            await progress_callback("Server Name", "DONE")
        except Exception:
            await progress_callback("Server Name", "ERROR")

    # 2. Sync Icon
    if "icon" in components:
        try:
            icon_bytes = None
            if context.discord_reader.guild and context.discord_reader.guild.icon:
                icon_bytes = await context.discord_reader.download_asset(context.discord_reader.guild.icon)
            
            if icon_bytes:
                await context.writer.update_guild_metadata(icon=icon_bytes)
                cloned_data["icon"] = icon_bytes
                await progress_callback("Server Icon", "DONE")
            else:
                await progress_callback("Server Icon", "SKIP")
        except Exception:
            await progress_callback("Server Icon", "ERROR")
        
    # 3. Sync Banner
    if "banner" in components:
        try:
            banner_bytes = None
            if context.discord_reader.guild and context.discord_reader.guild.banner:
                banner_bytes = await context.discord_reader.download_asset(context.discord_reader.guild.banner)
            
            if banner_bytes:
                await context.writer.update_guild_metadata(banner=banner_bytes)
                cloned_data["banner"] = banner_bytes
                await progress_callback("Server Banner", "DONE")
            else:
                await progress_callback("Server Banner", "SKIP")
        except Exception:
            await progress_callback("Server Banner", "ERROR")
            
    return cloned_data
