from get_background import download_image_with_httpx_auto_redirect
from create_image import create_image

# Java版查询模块
from mc_status_api.JavaServerStatus import java_status
# 基岩版查询模块
from mc_status_api.BedrockServerStatus import bedrock_status
# 此API优先解析 srv 记录
from mc_status_api.dnslookup import dns_lookup
# 格式化文本
from mc_status_api.FormatData import format_java_data, format_bedrock_data, format_index, format_java_index, format_bedrock_index

import base64
import asyncio

BACKGROUND_URL = "https://www.loliapi.com/acg/"
DEFAULT_ICON = "./minecraft-creeper-face.png"

if DEFAULT_ICON.startswith("http"):
    default_icon = asyncio.run(download_image_with_httpx_auto_redirect(DEFAULT_ICON))
    if not default_icon:
        default_icon = None
else:
    with open(DEFAULT_ICON, "rb") as f:
        default_icon = f.read()

async def generate_java_status_image(addr: str):
    loop = asyncio.get_event_loop()
    try:
        ip, type = await loop.run_in_executor(None, dns_lookup, addr)
        status = await loop.run_in_executor(None, java_status, ip)
        data = format_java_data(ip, type, status)
    except Exception as e:
        print(f"查询服务器时出错: {e}")
        return
    
    background_data = await download_image_with_httpx_auto_redirect(BACKGROUND_URL)
    if not background_data:
        background_data = None
    
    motd_list = data['motd'].split("\n")
    text_list = [
        f"ip: {data['ip']}",
        f"type: {data['type']}",
        f"version: {data['version']}",
        f"latency: {round(data['latency'], 2)} ms",
        f"players: {data['players']['online']}/{data['players']['max']}",
    ]

    if status.icon:
        image = await loop.run_in_executor(None,
                                           create_image,
                                           background_data,
                                           base64.b64decode(status.icon.split(",")[1]),
                                           text_list,
                                           motd_list)
    else:
        image = await loop.run_in_executor(None,
                                           create_image,
                                           background_data,
                                           default_icon,
                                           text_list,
                                           motd_list)
    return image

async def generate_bedrock_status_image(addr: str):
    loop = asyncio.get_event_loop()
    try:
        ip, type = await loop.run_in_executor(None, dns_lookup, addr)
        status = await loop.run_in_executor(None, bedrock_status, ip)
        data = format_bedrock_data(ip, status)
    except Exception as e:
        print(f"查询服务器时出错: {e}")
        return
    
    background_data = await download_image_with_httpx_auto_redirect(BACKGROUND_URL)
    if not background_data:
        background_data = None
    
    motd_list = data['motd'].split("\n")
    text_list = [
        f"ip: {data['ip']}",
        f"version: {data['version']}",
        f"latency: {round(data['latency'], 2)} ms",
        f"players: {data['players']['online']}/{data['players']['max']}",
    ]

    image = await loop.run_in_executor(None,
                                           create_image,
                                           background_data,
                                           default_icon,
                                           text_list,
                                           motd_list)
    return image

if __name__ == "__main__":
    image = asyncio.run(generate_java_status_image("mc.hypixel.net"))
    if image:
        image.save("output_image.png")
        
    image = asyncio.run(generate_bedrock_status_image("play.cubecraft.net"))
    if image:
        image.save("output_image-be.png")