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

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from telegram import Update
from telegram.ext import (
    Updater, CommandHandler, MessageHandler, Filters,
    ConversationHandler, CallbackContext
)

# ====================== تنظیمات ======================
TELEGRAM_TOKEN = "8934036091:AAG_oJAsJ0dzO4khL9ig6lGA1YO0YTDkQA0"

ALLOWED_USERS = {
    8951484493,
    5566521544,
    8815575448,
}

SENDERS = [
    {"email": "ssb.gameplays1@gmail.com", "password": "joio idzg swdd lfxs"},
    {"email": "kasraramezanpour001@gmail.com", "password": "spyp wdja jezi uvsd"},
    {"email": "bwbw07639@gmail.com", "password": "tijp ctwa hnpq qcom"},
    {"email": "winstonlite127@gmail.com", "password": "wpyj okkn zqxw fjdv"},
]
# ====================================================

started_users = {}
EMAIL, SUBJECT, BODY, TIMES, CONFIRM = range(5)

def is_allowed(user_id):
    return user_id in ALLOWED_USERS

def start(update, context):
    user = update.effective_user
    started_users[user.id] = {
        "name": user.full_name,
        "username": user.username or "ندارد"
    }
    if not is_allowed(user.id):
        update.message.reply_text("شما اجازه استفاده ندارید.")
        return
    update.message.reply_text(
        "سلام!\n\n"
        "/send - ارسال ایمیل\n"
        "/users - لیست کاربران\n"
        "/cancel - لغو"
    )

def users_list(update, context):
    if not is_allowed(update.effective_user.id):
        update.message.reply_text("دسترسی نداری.")
        return
    if not started_users:
        update.message.reply_text("هنوز کسی استارت نکرده.")
        return
    text = "کاربرانی که ربات را استارت کرده‌اند:\n\n"
    for uid, info in started_users.items():
        text += "• {} (@{}) - `{}`\n".format(info['name'], info['username'], uid)
    update.message.reply_text(text)

def send_start(update, context):
    if not is_allowed(update.effective_user.id):
        update.message.reply_text("دسترسی نداری.")
        return ConversationHandler.END
    context.user_data.clear()
    update.message.reply_text("ایمیل گیرنده را وارد کن:")
    return EMAIL

def get_email(update, context):
    if not is_allowed(update.effective_user.id):
        return ConversationHandler.END
    email = update.message.text.strip()
    if "@" not in email:
        update.message.reply_text("ایمیل نامعتبر است:")
        return EMAIL
    context.user_data["email"] = email
    update.message.reply_text("موضوع را بنویس:")
    return SUBJECT

def get_subject(update, context):
    if not is_allowed(update.effective_user.id):
        return ConversationHandler.END
    context.user_data["subject"] = update.message.text
    update.message.reply_text("متن ایمیل را بنویس:")
    return BODY

def get_body(update, context):
    if not is_allowed(update.effective_user.id):
        return ConversationHandler.END
    context.user_data["body"] = update.message.text
    update.message.reply_text("چند بار ارسال شود؟ (عدد)")
    return TIMES

def get_times(update, context):
    if not is_allowed(update.effective_user.id):
        return ConversationHandler.END
    text = update.message.text.strip()
    if not text.isdigit() or int(text) < 1:
        update.message.reply_text("عدد معتبر وارد کن:")
        return TIMES
    context.user_data["times"] = int(text)
    summary = (
        "گیرنده: {}\n"
        "موضوع: {}\n"
        "تعداد: {}\n\n"
        "{}\n\n"
        "اگر درست است /confirm بفرست"
    ).format(
        context.user_data['email'],
        context.user_data['subject'],
        context.user_data['times'],
        context.user_data['body']
    )
    update.message.reply_text(summary)
    return CONFIRM

def confirm_send(update, context):
    if not is_allowed(update.effective_user.id):
        return ConversationHandler.END

    update.message.reply_text("**لطفاً منتظر بمانید تا نتیجه عملیات به شما نمایش داده شود...**")

    recipient = context.user_data["email"]
    subject = context.user_data["subject"]
    body = context.user_data["body"]
    times = context.user_data["times"]

    total_success = 0

    for sender in SENDERS:
        try:
            server = smtplib.SMTP_SSL("smtp.gmail.com", 465)
            server.login(sender["email"], sender["password"])
            for _ in range(times):
                msg = MIMEMultipart()
                msg["From"] = sender["email"]
                msg["To"] = recipient
                msg["Subject"] = subject
                msg.attach(MIMEText(body, "plain", "utf-8"))
                server.sendmail(sender["email"], recipient, msg.as_string())
                total_success += 1
            server.quit()
        except Exception:
            pass

    update.message.reply_text(
        "✅ ارسال با موفقیت انجام شد\n"
        "تعداد کل ایمیل‌های ارسال‌شده: {}".format(total_success)
    )

    context.user_data.clear()
    return ConversationHandler.END

def cancel(update, context):
    context.user_data.clear()
    update.message.reply_text("لغو شد.")
    return ConversationHandler.END

def main():
    updater = Updater(TELEGRAM_TOKEN, use_context=True)
    dp = updater.dispatcher

    conv = ConversationHandler(
        entry_points=[CommandHandler("send", send_start)],
        states={
            EMAIL: [MessageHandler(Filters.text, get_email)],
            SUBJECT: [MessageHandler(Filters.text, get_subject)],
            BODY: [MessageHandler(Filters.text, get_body)],
            TIMES: [MessageHandler(Filters.text, get_times)],
            CONFIRM: [CommandHandler("confirm", confirm_send)],
        },
        fallbacks=[CommandHandler("cancel", cancel)],
    )

    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("users", users_list))
    dp.add_handler(conv)
    dp.add_handler(CommandHandler("cancel", cancel))

    print("ربات روشن شد...")
    updater.start_polling()
    updater.idle()

if __name__ == "__main__":
    main()