from telethon import TelegramClient, events
from telethon.tl.types import UserStatusOnline, UserStatusOffline, UpdateUserStatus
import mysql.connector
from datetime import datetime
import asyncio
import sys

import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# Настройки Telethon
api_id = 20045757
api_hash = '7d3ea0c0d4725498789bd51a9ee02421'
target_username = 'ayd_is'

# Настройки БД
db_config = {
    'host': 'localhost',
    'user': 'root',
    'password': '!435380Isa',
    'database': 'gloor',
    'autocommit': True
}

# Подключение к клиенту
client = TelegramClient('session_name', api_id, api_hash)

# Последний статус
last_status = None
target_id = None


# === Работа с БД ===

def insert_login(cursor, user_id, username, time):
    cursor.execute("""
        INSERT INTO tg_status_log (user_id, username, login_time)
        VALUES (%s, %s, %s)
    """, (user_id, username, time))


def update_logout(cursor, user_id, time):
    cursor.execute("""
        UPDATE tg_status_log
        SET logout_time = %s
        WHERE user_id = %s AND logout_time IS NULL
        ORDER BY id DESC LIMIT 1
    """, (time, user_id))


def ensure_cleanup_on_start(cursor, user_id):
    """Закрыть все открытые сессии при запуске (вдруг до этого упал скрипт)"""
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    update_logout(cursor, user_id, now)


# === Обработчик статусов ===

@client.on(events.Raw)
async def status_handler(event):
    global last_status
    if isinstance(event, UpdateUserStatus) and event.user_id == target_id:
        conn = mysql.connector.connect(**db_config)
        cursor = conn.cursor()

        now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        if isinstance(event.status, UserStatusOnline):
            if last_status != 'online':
                print(f"[{now}] {target_username} — 🟢 В СЕТИ", flush=True)
                insert_login(cursor, target_id, target_username, now)
                last_status = 'online'

        elif isinstance(event.status, UserStatusOffline):
            if last_status != 'offline':
                print(f"[{now}] {target_username} — 🔴 НЕ В СЕТИ", flush=True)
                update_logout(cursor, target_id, now)
                last_status = 'offline'

        cursor.close()
        conn.close()


# === Основной поток ===

async def main():
    global target_id
    await client.start()
    user = await client.get_entity(target_username)
    target_id = user.id
    print(f"Слежу за: {target_username} (user_id: {target_id})", flush=True)

    # Очистка зависших сессий
    conn = mysql.connector.connect(**db_config)
    ensure_cleanup_on_start(conn.cursor(), target_id)
    conn.close()

    await client.run_until_disconnected()


# === Запуск
if __name__ == '__main__':
    try:
        loop = asyncio.get_event_loop()
        loop.run_until_complete(main())
    except KeyboardInterrupt:
        print("⛔ Остановлено вручную", flush=True)
