import re
import asyncio
import os
import random 
import time
import hashlib  # <--- NEW: Used for generating text fingerprints
from telethon import TelegramClient, events, errors
import config  
from insta_handler import upload_to_instagram

# --- SETUP ---
# auto_reconnect=True helps, but the loop below guarantees it
client = TelegramClient(config.SESSION_NAME, config.API_ID, config.API_HASH, auto_reconnect=True)

# --- STATE: MESSAGE IDs ---
HISTORY_FILE = "router_history.txt"
album_buffer = {}       
processed_ids = set()   
if os.path.exists(HISTORY_FILE):
    with open(HISTORY_FILE, "r") as f:
        processed_ids = set(line.strip() for line in f if line.strip())

def save_id(unique_id):
    with open(HISTORY_FILE, "a") as f: f.write(f"{unique_id}\n")

# --- STATE: TEXT FINGERPRINTS (DEDUPLICATION) ---
HASH_FILE = "content_hashes.txt"
processed_hashes = set()
if os.path.exists(HASH_FILE):
    with open(HASH_FILE, "r") as f:
        processed_hashes = set(line.strip() for line in f if line.strip())

def save_hash(text_hash):
    with open(HASH_FILE, "a") as f: f.write(f"{text_hash}\n")

# --- CLEANING LOGIC ---
FORBIDDEN_WORDS = [
    "تبلیغ", "کازینو", "bet", "crypto", "vpn", "VPN",
    "فیلترشکن", "فیلتر شکن", "سرور اختصاصی", "زگیل تناسلی",
    "قمار", "ChatGPT", "Canva", "پروستات", "کبدچرب", "گوارشی", "ویزا"
]
REPLACEMENTS = {
    "@VahidOOnLine":"", "Vahid": "", "sentdefender": "", "visegrad24": "",
    "Mojtabapacino": "", "rt_rtiy": "", "✍🏻 adolf hitler": "", "✍🏻 a.tirandaz": "",
    "✍🏻 Nadershah": "", "✍🏻 BOSS": "", "✍🏻 exxon": "", "📝 adolf hitler ": "",
    "✍🏻 𝑻𝑲𝑴":"", "✍🏻 𝑺𝑨𝑹𝑫𝑨𝑹⁪⁬⁮⁮":"", "📝 CAPITANO":"", "✍🏻 Niko":"","✍🏻 CAPITANO":"",
    "NewshaSaremi":"", "✍🏻 BLACK WOLF":"", "✍ Anarchist":"", "✍🏻 ARTEMIS":"","📡 @Online":"",
    "✍🏻  a.tirandaz":"", "✍🏻  Cybex":"", "✍🏻 Cybex":"", "ShahedAlavi":"","📝pajouhesh":"",
    "@VahidHeadline":"", "✍🏻 BOBOOL":"", "▪️ @WARS_NEWS":"","✍🏻 Hitman":"","@WARS_NEWS":"","✍🏻satar khan":"","Hitman":"",
    "✍️satar khan":"","✍🏻 Dangerman":"","hitler":""
}
HASHTAG_POOL = [
    "#خبر_تحلیلی", "#تحلیل_روز", "#پشت_پرده_سیاسی", "#گزارش_ویژه",
    "#روایت_میدان", "#تحولات_منطقه", "#نبض_خاورمیانه", "#معادلات_قدرت",
    "#اتاق_فکر", "#برآورد_امنیتی", "#موازنه_قوا", "#سناریو_سیاسی",
    "#آینده_ایران", "#تصمیم_بزرگ", "#پیام_سیاسی", "#هشدار_امنیتی",
    "#گسل_سیاسی", "#نقطه_عطف", "#قبل_از_وقوع"
]

def clean_text(text):
    if not text: return None
    
    # 1. Normalize text for checking (Lower case for English)
    text_lower = text.lower()
    
    # 2. CHECK FORBIDDEN WORDS (Case Insensitive)
    for bad_word in FORBIDDEN_WORDS:
        if bad_word.lower() in text_lower:
            print(f"⛔ Blocked Forbidden Word: {bad_word}")
            return None 

    # 3. REMOVE LINKS
    text = re.sub(r'https?://\S+', '', text)

    # 4. REMOVE WORDS CONTAINING '@' AND STARTING WITH '📡'
    text = re.sub(r'\S*@\S*', '', text)
    text = re.sub(r'📡\S*', '', text)
    text = re.sub(r'✍🏻 \S*', '', text)

    # 5. APPLY REPLACEMENTS (Case Insensitive)
    sorted_replacements = sorted(REPLACEMENTS.keys(), key=len, reverse=True)
    
    for target in sorted_replacements:
        replacement = REPLACEMENTS[target]
        pattern = re.compile(re.escape(target), re.IGNORECASE)
        text = pattern.sub(replacement, text)

    # 6. CLEAN UP EXTRA WHITESPACE/LINES
    lines = text.split('\n')
    cleaned_lines = []
    for line in lines:
        line = line.strip()
        if not line: continue
        
        if line.startswith('@') and len(line.split()) == 1:
            continue
            
        cleaned_lines.append(line)
    
    final_text = "\n".join(cleaned_lines).strip()

    # 7. FINAL EMPTY CHECK
    if not final_text: 
        return None
        
    return final_text

# --- PROCESSING ---
async def process_event(event_message, settings):
    # 1. Chat ID + Message ID Tracking
    msg_id = event_message.id
    chat_id = event_message.chat_id
    unique_msg_id = f"{chat_id}_{msg_id}"
    
    if unique_msg_id in processed_ids: return

    # 2. Prepare Text
    raw = event_message.text or ""
    cleaned = clean_text(raw)
    
    if not cleaned:
        print("⛔ No valid text found. Skipping.")
        return

    # 3. CHECK FOR DUPLICATE CONTENT (Fingerprint)
    text_fingerprint = hashlib.md5(cleaned.encode('utf-8')).hexdigest()
    
    if text_fingerprint in processed_hashes:
        print("⏩ Duplicate Content Detected. Skipping.")
        return
        
    # If content is new, save both ID and Hash
    processed_hashes.add(text_fingerprint)
    save_hash(text_fingerprint)
    
    processed_ids.add(unique_msg_id)
    save_id(unique_msg_id)

    # 4. Finalize Caption
    signature = settings.get('signature', "")
    tags = " ".join(random.sample(HASHTAG_POOL, 5))
    caption = f"{cleaned}{signature}\n\n{tags}"

    # 5. Handle Album vs Single
    if event_message.grouped_id:
        gid = event_message.grouped_id
        if gid not in album_buffer:
            album_buffer[gid] = []
            asyncio.create_task(process_album(gid, caption, settings))
        album_buffer[gid].append(event_message)
        print(f"   📥 Buffered Part for Group {gid}")
        return 
        
    else:
        # Single Message
        target_id = settings['target_telegram_id'] 
        token = settings.get('access_token')        
        uid = settings.get('ig_user_id')            

        try:
            await client.send_message(target_id, caption, file=event_message.media)
            print(f"✅ Sent to Target Channel {target_id}")
        except Exception as e: print(f"❌ TG Error: {e}")

        if event_message.media and token:
            path = await client.download_media(event_message)
            await asyncio.shield(asyncio.to_thread(upload_to_instagram, path, caption, token, uid))

async def process_album(gid, caption, settings):
    await asyncio.sleep(5)
    msgs = album_buffer.pop(gid, [])
    if not msgs: return
    msgs.sort(key=lambda x: x.id)
    
    target_id = settings['target_telegram_id'] 
    token = settings.get('access_token')       
    uid = settings.get('ig_user_id')           

    try:
        media = [m.media for m in msgs]
        await client.send_message(target_id, caption, file=media)
        print(f"✅ Album Sent to {target_id}")
    except Exception as e: print(f"❌ TG Album Error: {e}")

    if token:
        paths = []
        for m in msgs:
            p = await client.download_media(m)
            paths.append(p)
        await asyncio.shield(asyncio.to_thread(upload_to_instagram, paths, caption, token, uid))

@client.on(events.NewMessage(chats=config.SOURCE_CHANNELS))
async def router(event):
    source_id = event.chat_id
    settings = config.CHANNEL_MAP.get(source_id)
    if settings:
        print(f"🔔 Routing Message from {source_id}")
        await process_event(event.message, settings)

# --- MAIN BULLETPROOF LOOP ---
if __name__ == '__main__':
    print(f"🌍 Router Bot Listening on {len(config.SOURCE_CHANNELS)} Channels...")
    
    while True:
        try:
            client.start()
            client.run_until_disconnected()
        except (errors.RpcError, ConnectionError, OSError) as e:
            print(f"⚠️ Network Fluctuation: {e}")
            print("🔄 Reconnecting in 5 seconds...")
            time.sleep(5)
        except Exception as e:
            print(f"❌ Critical Error: {e}")
            print("🔄 Restarting bot in 5 seconds...")
            time.sleep(5)