import discord
from discord.ext import commands, tasks
import json
import os
import asyncio
from dotenv import load_dotenv
from datetime import datetime
import pytz
import socket

load_dotenv()

def load_config(filename):
    if not os.path.exists(filename):
        return {}   
    with open(filename, "r") as f:
        return json.load(f)

def get_prefix(bot, message):
    """Dynamicky načte prefix z .env při každém příkazu"""
    load_dotenv(override=True)
    return os.getenv("PREFIX", "!")

def check_service(host, port):
    """Kontrola dostupnosti služby"""
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(2)
        result = sock.connect_ex((host, port))
        sock.close()
        return result == 0
    except:
        return False

# Použij dynamický prefix
intents = discord.Intents.all()
bot = commands.Bot(command_prefix=get_prefix, intents=intents, help_command=None)

@tasks.loop(seconds=3)
async def update_status():
    """Dynamický status s časem, datem, web statusem a prefixem"""
    # Získej aktuální prefix
    load_dotenv(override=True)
    current_prefix = os.getenv("PREFIX", "!")
    
    tz = pytz.timezone('Europe/Prague')
    now = datetime.now(tz)

    web_online = check_service("buzzhost.eu", 80)  
    web_status = "✅" if web_online else "❌"

    mod = now.second % 4  # 4 stavy, každé 3 sekundy

    if mod == 0:
        cas = now.strftime("%H:%M")
        status_text = f"Čas: {cas}"
    elif mod == 1:
        datum = now.strftime("%d.%m.%Y")
        status_text = f"Datum: {datum}"
    elif mod == 2:
        status_text = f"Web: {web_status}"
    elif mod == 3:
        status_text = f"Vyzkoušej {current_prefix}help"

    await bot.change_presence(activity=discord.Game(name=status_text))

async def watch_prefix_changes():
    """Sleduje změny prefixu a aktualizuje status"""
    while True:
        await asyncio.sleep(5)
        if os.path.exists("prefix_update.signal"):
            print("🔄 Aktualizuji status s novým prefixem...")
            os.remove("prefix_update.signal")
            # Status se aktualizuje automaticky pomocí @tasks.loop

@bot.event
async def on_ready():
    # Spustí dynamický status
    update_status.start()
    print(f"{bot.user.name} je připojen!")
    
    # Spuštění sledování prefix změn
    asyncio.create_task(watch_prefix_changes())

@bot.event
async def on_member_join(member):
    config = load_config("welcome_config.json")
    if not config.get("welcome_channel_id"):
        return
    
    channel = bot.get_channel(int(config["welcome_channel_id"]))
    if channel:
        embed = discord.Embed(
            title=config["welcome_embed"]["title"].replace("{user}", member.name),
            description=config["welcome_embed"]["description"],
            color=config["welcome_embed"]["color"]
        )
        await channel.send(embed=embed)

async def load_cogs():
    await bot.load_extension('cogs.verify')
    await bot.load_extension('cogs.admin')
    await bot.load_extension('cogs.general')
    await bot.load_extension('cogs.moderation')
    await bot.load_extension('cogs.music')
    await bot.load_extension('cogs.monitoring') 
    await bot.load_extension('cogs.leveling')
    await bot.load_extension('cogs.tickets')

async def main():
    await load_cogs()
    await bot.start(os.getenv("DISCORD_TOKEN"))

if __name__ == "__main__":
    asyncio.run(main())