#!/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.")
    
    try:
        # 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}"
            )
    except Exception as e:
        logger.error(f"Error processing Terabox URL: {e}")
        await update.message.reply_text(
            f"❌ Terjadi kesalahan saat memproses URL Terabox: {str(e)}\n"
            f"Silakan coba lagi nanti atau gunakan URL Terabox yang berbeda."
        )

# Fungsi utama
def main(application=None) -> None:
    """Memulai bot."""
    # Jika application tidak diberikan, buat baru
    if application is None:
        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,
            handle_terabox_url
        )
    )
    
    # Mulai polling hanya jika application dibuat di dalam fungsi ini
    if application is None:
        application.run_polling()

if __name__ == '__main__':
    main()
