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

import re
import logging
import os
import time
import requests
import json
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
    Application,
    CommandHandler,
    MessageHandler,
    CallbackQueryHandler,
    ContextTypes,
    filters
)
from config import (
    TOKEN, MAX_FILE_SIZE, TEMP_DOWNLOAD_DIR, 
    FORCE_CHANNEL_ID, FORCE_CHANNEL_USERNAME,
    SHOW_ADS, SHOW_AD_MESSAGES
)
from terabox import extract_terabox_url, check_url_patterns, get_terabox_download_link
from force_subscribe import add_force_subscription_handler
from ad_manager import AdManager

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

# Inisialisasi AdManager
ad_manager = AdManager({
    'GPLINKS_API_KEY': os.environ.get('GPLINKS_API_KEY', ''),
    'EZ4SHORT_API_KEY': os.environ.get('EZ4SHORT_API_KEY', ''),
    'DROPLINK_API_KEY': os.environ.get('DROPLINK_API_KEY', ''),
    'TNLINK_API_KEY': os.environ.get('TNLINK_API_KEY', '')
})

# Pastikan direktori download ada
if not os.path.exists(TEMP_DOWNLOAD_DIR):
    os.makedirs(TEMP_DOWNLOAD_DIR)

# Fungsi untuk menangani perintah /start
async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Mengirim pesan saat perintah /start diterima."""
    user = update.effective_user
    await update.message.reply_html(
        f"Halo {user.mention_html()}! 👋\n\n"
        f"Saya adalah bot untuk mengunduh file dari Terabox. "
        f"Kirimkan link Terabox dan saya akan mengunduhkannya untuk Anda.\n\n"
        f"Gunakan /help untuk melihat bantuan penggunaan."
    )
    
    if SHOW_AD_MESSAGES:
        # Tampilkan pesan iklan
        ad_message = ad_manager.get_ad_message()
        await update.message.reply_text(ad_message)

# Fungsi untuk menangani perintah /help
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Mengirim pesan bantuan saat perintah /help diterima."""
    help_text = (
        "🔍 *Cara Menggunakan Bot*\n\n"
        "1. Kirim link Terabox yang ingin diunduh\n"
        "2. Bot akan memproses link tersebut\n"
        "3. Jika berhasil, bot akan mengirimkan file atau link download\n\n"
        "🔗 *Domain Terabox yang Didukung*\n"
        "- terabox.com\n"
        "- teraboxapp.com\n"
        "- 1024tera.com\n"
        "- 4funbox.com\n"
        "- dan domain terkait lainnya\n\n"
        "⚠️ *Batasan*\n"
        "- Ukuran maksimum file: 50 MB\n"
        "- Beberapa file mungkin memerlukan akses premium\n\n"
        "📋 *Perintah*\n"
        "/start - Memulai bot\n"
        "/help - Menampilkan bantuan ini\n"
        "/status - Memeriksa status bot"
    )
    await update.message.reply_markdown(help_text)

# Fungsi untuk menangani perintah /status
async def status_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Mengirim status bot saat perintah /status diterima."""
    status_text = (
        "✅ *Status Bot*\n\n"
        f"Bot aktif dan berjalan dengan baik\n"
        f"Batas ukuran file: {MAX_FILE_SIZE / (1024 * 1024):.1f} MB\n"
        f"Direktori unduhan: {TEMP_DOWNLOAD_DIR}\n"
        f"Fitur iklan: {'Aktif' if SHOW_ADS else 'Nonaktif'}\n"
        f"Platform shortlink aktif: {', '.join(ad_manager.enabled_platforms) if ad_manager.enabled_platforms else 'Tidak ada'}"
    )
    await update.message.reply_markdown(status_text)

# Fungsi untuk menangani URL Terabox
async def handle_terabox_url(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Menangani URL Terabox yang dikirim oleh pengguna."""
    message_text = update.message.text
    
    # Ekstrak URL Terabox dari pesan
    terabox_url = extract_terabox_url(message_text)
    
    if not terabox_url:
        await update.message.reply_text("❌ URL Terabox tidak valid atau tidak ditemukan dalam pesan.")
        return
    
    await update.message.reply_text(f"✅ URL Terabox valid: {terabox_url}\n⏳ Sedang memproses URL Terabox... Mohon tunggu.")
    
    # Dapatkan link download dari Terabox
    result = get_terabox_download_link(terabox_url)
    
    if not result:
        await update.message.reply_text("❌ Gagal mendapatkan link download dari Terabox.")
        return
    
    # Jika berhasil mendapatkan link download
    file_name = result.get('file_name', 'terabox_file')
    file_size = result.get('size', 'Unknown')
    direct_link = result.get('direct_link')
    requires_premium = result.get('requires_premium', False)
    
    # Jika file memerlukan akses premium
    if requires_premium:
        await update.message.reply_text(
            f"⚠️ File ini memerlukan akses premium untuk diunduh.\n\n"
            f"📄 Nama file: {file_name}\n"
            f"📦 Ukuran: {file_size}\n"
            f"🔗 Link: {terabox_url}"
        )
        return
    
    # Jika ukuran file terlalu besar
    if result.get('size_bytes') and result.get('size_bytes') > MAX_FILE_SIZE:
        await update.message.reply_text(
            f"⚠️ File terlalu besar untuk diunduh langsung.\n\n"
            f"📄 Nama file: {file_name}\n"
            f"📦 Ukuran: {file_size}\n"
            f"🔗 Link: {direct_link}"
        )
        
        # Jika iklan diaktifkan, buat shortlink
        if SHOW_ADS and direct_link:
            shortlink_result = ad_manager.create_shortlink(direct_link)
            
            if shortlink_result['success']:
                await update.message.reply_text(
                    f"✅ Link download berhasil dipersingkat!\n\n"
                    f"🔗 Link download: {shortlink_result['shortlink']}"
                    f"{ad_manager.get_ad_footer()}"
                )
            else:
                await update.message.reply_text(
                    f"⚠️ Gagal mempersingkat link. Gunakan link langsung:\n\n"
                    f"🔗 Link download: {direct_link}"
                )
        return
    
    # Jika ukuran file dalam batas dan ada direct link
    if direct_link:
        await update.message.reply_text(
            f"✅ Link download berhasil ditemukan!\n\n"
            f"📄 Nama file: {file_name}\n"
            f"📦 Ukuran: {file_size}\n"
            f"⏳ Sedang mengunduh file... Mohon tunggu."
        )
        
        try:
            # Unduh file
            file_path = os.path.join(TEMP_DOWNLOAD_DIR, file_name)
            
            # Download file dengan progress
            response = requests.get(direct_link, stream=True)
            total_size = int(response.headers.get('content-length', 0))
            
            with open(file_path, 'wb') as f:
                downloaded = 0
                start_time = time.time()
                last_update_time = start_time
                
                for chunk in response.iter_content(chunk_size=8192):
                    if chunk:
                        f.write(chunk)
                        downloaded += len(chunk)
                        
                        # Update progress setiap 3 detik
                        current_time = time.time()
                        if current_time - last_update_time > 3:
                            progress = downloaded / total_size * 100
                            speed = downloaded / (current_time - start_time) / 1024
                            await update.message.reply_text(
                                f"⏳ Mengunduh: {progress:.1f}% ({speed:.1f} KB/s)"
                            )
                            last_update_time = current_time
            
            # Kirim file ke pengguna
            with open(file_path, 'rb') as f:
                await update.message.reply_document(
                    document=f,
                    filename=file_name,
                    caption=f"✅ File berhasil diunduh!\n📄 Nama file: {file_name}\n📦 Ukuran: {file_size}"
                )
            
            # Hapus file setelah dikirim
            os.remove(file_path)
            
            # Tampilkan pesan iklan jika diaktifkan
            if SHOW_AD_MESSAGES:
                ad_message = ad_manager.get_ad_message()
                await update.message.reply_text(ad_message)
                
        except Exception as e:
            logger.error(f"Error downloading file: {e}")
            await update.message.reply_text(
                f"❌ Gagal mengunduh file: {str(e)}\n\n"
                f"Gunakan link download langsung:\n"
                f"🔗 {direct_link}"
            )
            
            # Jika iklan diaktifkan, buat shortlink
            if SHOW_ADS:
                shortlink_result = ad_manager.create_shortlink(direct_link)
                
                if shortlink_result['success']:
                    await update.message.reply_text(
                        f"✅ Link download berhasil dipersingkat!\n\n"
                        f"🔗 Link download: {shortlink_result['shortlink']}"
                        f"{ad_manager.get_ad_footer()}"
                    )
    else:
        await update.message.reply_text(
            f"⚠️ Tidak dapat mendapatkan link download langsung.\n\n"
            f"📄 Nama file: {file_name}\n"
            f"📦 Ukuran: {file_size}\n"
            f"🔗 Link asli: {terabox_url}"
        )

# Fungsi utama
def main() -> None:
    """Memulai bot."""
    # Buat aplikasi dan tambahkan handlers
    application = Application.builder().token(TOKEN).build()
    
    # Tambahkan handler force subscription
    force_sub_filter = add_force_subscription_handler(application)
    
    # Tambahkan handler untuk perintah
    application.add_handler(CommandHandler("start", start_command))
    application.add_handler(CommandHandler("help", help_command))
    application.add_handler(CommandHandler("status", status_command))
    
    # Tambahkan handler untuk URL Terabox
    application.add_handler(
        MessageHandler(
            filters.TEXT & ~filters.COMMAND & force_sub_filter,
            handle_terabox_url
        )
    )
    
    # Mulai polling
    application.run_polling()

if __name__ == '__main__':
    main()
