import asyncio
import logging
import sys
import json
import os

from aiogram import Bot, Dispatcher, F
from aiogram.filters import CommandStart, Command
from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup

API_TOKEN = os.getenv("BOT_TOKEN", "PUT_YOUR_BOT_TOKEN_HERE")

# آیدی عددی ادمین را وارد کنید
ADMIN_ID = 123456789

SETTINGS_FILE = "settings.json"

DEFAULT_SETTINGS = {
    "welcome_message": "سلام! پیام خود را بفرستید تا به دست مدیر برسد.",
    "confirmation_message": "✅ پیام شما دریافت شد و برای مدیر ارسال گردید."
}


def load_settings():
    if os.path.exists(SETTINGS_FILE):
        try:
            with open(SETTINGS_FILE, "r", encoding="utf-8") as f:
                return json.load(f)
        except Exception:
            pass
    return DEFAULT_SETTINGS.copy()


def save_settings(settings_data):
    with open(SETTINGS_FILE, "w", encoding="utf-8") as f:
        json.dump(settings_data, f, ensure_ascii=False, indent=4)


class AdminStates(StatesGroup):
    waiting_for_new_welcome = State()
    waiting_for_new_confirmation = State()


logging.basicConfig(level=logging.INFO, stream=sys.stdout)

bot = Bot(token=API_TOKEN)
dp = Dispatcher()
current_settings = load_settings()


def get_admin_kb():
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text="👋 تغییر متن خوش‌آمدگویی", callback_data="set_welcome")],
            [InlineKeyboardButton(text="✅ تغییر متن تایید ارسال", callback_data="set_confirm")],
            [InlineKeyboardButton(text="📝 مشاهده تنظیمات فعلی", callback_data="view_all_settings")]
        ]
    )


@dp.message(CommandStart())
async def command_start_handler(message: Message):
    if message.from_user.id == ADMIN_ID:
        await message.answer("سلام مدیر! برای مدیریت ربات از دستور /admin استفاده کنید.")
    else:
        await message.answer(
            current_settings.get("welcome_message", DEFAULT_SETTINGS["welcome_message"])
        )


@dp.message(Command("admin"))
async def admin_panel(message: Message):
    if message.from_user.id != ADMIN_ID:
        return

    await message.answer("🛠 پنل مدیریت ربات:", reply_markup=get_admin_kb())


@dp.callback_query(F.data == "set_welcome")
async def start_set_welcome(callback: CallbackQuery, state: FSMContext):
    await callback.message.answer("لطفاً متن جدید خوش‌آمدگویی را ارسال کنید:")
    await state.set_state(AdminStates.waiting_for_new_welcome)
    await callback.answer()


@dp.callback_query(F.data == "set_confirm")
async def start_set_confirm(callback: CallbackQuery, state: FSMContext):
    await callback.message.answer("لطفاً متن جدید تایید ارسال پیام را ارسال کنید:")
    await state.set_state(AdminStates.waiting_for_new_confirmation)
    await callback.answer()


@dp.callback_query(F.data == "view_all_settings")
async def view_settings(callback: CallbackQuery):
    welcome = current_settings.get("welcome_message", "تعریف نشده")
    confirm = current_settings.get("confirmation_message", "تعریف نشده")

    text = (
        f"📋 تنظیمات فعلی:\\n\\n"
        f"1️⃣ متن خوش‌آمدگویی:\\n{welcome}\\n\\n"
        f"2️⃣ متن تایید ارسال:\\n{confirm}"
    )

    await callback.message.answer(text)
    await callback.answer()


@dp.message(AdminStates.waiting_for_new_welcome)
async def process_new_welcome(message: Message, state: FSMContext):
    current_settings["welcome_message"] = message.text
    save_settings(current_settings)

    await message.answer(
        "✅ متن خوش‌آمدگویی آپدیت شد.",
        reply_markup=get_admin_kb()
    )
    await state.clear()


@dp.message(AdminStates.waiting_for_new_confirmation)
async def process_new_confirm(message: Message, state: FSMContext):
    current_settings["confirmation_message"] = message.text
    save_settings(current_settings)

    await message.answer(
        "✅ متن تایید ارسال آپدیت شد.",
        reply_markup=get_admin_kb()
    )
    await state.clear()


@dp.message()
async def main_handler(message: Message):
    if message.from_user.id == ADMIN_ID:
        if message.reply_to_message:
            try:
                content = message.reply_to_message.text or message.reply_to_message.caption or ""

                if "🔢 ID:" in content:
                    target_id = int(
                        content.split("🔢 ID:")[1].split("\\n")[0].strip()
                    )

                    await bot.copy_message(
                        chat_id=target_id,
                        from_chat_id=ADMIN_ID,
                        message_id=message.message_id
                    )

                    await message.answer("✔️ پاسخ شما برای کاربر ارسال شد.")
                else:
                    await message.answer("❌ آیدی کاربر یافت نشد.")

            except Exception as e:
                await message.answer(f"❌ خطا: {e}")

        return

    user = message.from_user

    info_text = (
        f"📩 پیام جدید از:\\n"
        f"👤 نام: {user.full_name}\\n"
        f"🆔 یوزرنیم: @{user.username or 'ندارد'}\\n"
        f"🔢 ID: {user.id}\\n"
        f"➖➖➖➖➖➖\\n"
    )

    try:
        if message.text:
            await bot.send_message(
                chat_id=ADMIN_ID,
                text=info_text + f"📝 متن:\\n{message.text}"
            )
        else:
            await bot.copy_message(
                chat_id=ADMIN_ID,
                from_chat_id=message.chat.id,
                message_id=message.message_id
            )

            await bot.send_message(
                chat_id=ADMIN_ID,
                text=info_text
            )

        await message.answer(
            current_settings.get(
                "confirmation_message",
                DEFAULT_SETTINGS["confirmation_message"]
            )
        )

    except Exception as e:
        logging.error(f"Error: {e}")


async def main():
    await dp.start_polling(bot)


if __name__ == "__main__":
    asyncio.run(main())
