#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import re
import logging
import os
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
    Application,
    CommandHandler,
    MessageHandler,
    CallbackQueryHandler,
    ContextTypes,
    filters
)
from config import TOKEN, FORCE_CHANNEL_ID, FORCE_CHANNEL_USERNAME

# Konfigurasi logging
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)
logger = logging.getLogger(__name__)

# Dictionary untuk melacak status pengguna
user_status = {}

# Fungsi untuk memeriksa apakah pengguna telah bergabung dengan channel
async def check_user_joined_channel(client, user_id):
    try:
        member = await client.get_chat_member(FORCE_CHANNEL_ID, user_id)
        return member.status not in ["left", "kicked"]
    except Exception as e:
        logger.error(f"Error checking user membership: {e}")
        return False

# Fungsi untuk menangani callback query dari tombol "Saya sudah bergabung"
async def check_subscription_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    query = update.callback_query
    user_id = update.effective_user.id
    
    # Periksa apakah pengguna telah bergabung dengan channel
    has_joined = await check_user_joined_channel(context.bot, user_id)
    
    if has_joined:
        # Jika pengguna telah bergabung, izinkan mereka mengunduh
        user_status[user_id] = True
        await query.answer("Terima kasih telah bergabung dengan channel kami!")
        await query.edit_message_text(
            "✅ Verifikasi berhasil! Anda sekarang dapat mengunduh file.\n\n"
            "Silakan kirim URL Terabox lagi untuk mengunduh file."
        )
    else:
        # Jika pengguna belum bergabung, beri tahu mereka
        await query.answer("Anda belum bergabung dengan channel kami. Silakan bergabung terlebih dahulu.", show_alert=True)

# Fungsi untuk memeriksa apakah pengguna telah bergabung dengan channel sebelum mengunduh
async def force_subscription_filter(update: Update, context: ContextTypes.DEFAULT_TYPE) -> bool:
    user_id = update.effective_user.id
    
    # Jika pengguna sudah diverifikasi sebelumnya
    if user_id in user_status and user_status[user_id]:
        return True
    
    # Periksa apakah pengguna telah bergabung dengan channel
    has_joined = await check_user_joined_channel(context.bot, user_id)
    
    if has_joined:
        # Jika pengguna telah bergabung, izinkan mereka mengunduh
        user_status[user_id] = True
        return True
    else:
        # Jika pengguna belum bergabung, minta mereka untuk bergabung
        keyboard = InlineKeyboardMarkup([
            [InlineKeyboardButton("🔔 Gabung Channel", url=f"https://t.me/{FORCE_CHANNEL_USERNAME}")],
            [InlineKeyboardButton("✅ Saya sudah bergabung", callback_data="check_subscription")]
        ])
        
        await update.message.reply_text(
            f"⚠️ Untuk mengunduh file, Anda harus bergabung dengan channel kami terlebih dahulu.\n\n"
            f"1. Klik tombol \"🔔 Gabung Channel\" di bawah\n"
            f"2. Setelah bergabung, klik tombol \"✅ Saya sudah bergabung\"\n"
            f"3. Anda akan dapat mengunduh file setelah verifikasi berhasil",
            reply_markup=keyboard
        )
        return False

# Fungsi untuk menambahkan filter force subscription ke bot
def add_force_subscription_handler(application):
    # Tambahkan handler untuk callback query dari tombol "Saya sudah bergabung"
    application.add_handler(CallbackQueryHandler(check_subscription_callback, pattern="^check_subscription$"))
    
    return force_subscription_filter
