from html import escape
from pyrogram.enums import MessageOriginType
from pyrogram.types import Message, ReplyParameters, InlineKeyboardButton, InlineKeyboardMarkup

import app

from app.config import ADMINS
from app.handlers.buttons import Buttons

class MediaHandler:
    async def media_handler(self: "app.App", _, message: Message):
        user_id = message.from_user.id
        
        if self.setting.off and user_id not in ADMINS:
            return await message.reply_text(
                text="⭕️ ربات در حال حاضر خاموش است.",
                reply_parameters=ReplyParameters(quote=True)
            )
        
        elif await self.database.get_block(user_id):
            return await message.reply_text(
                text="🚫 شما از گسترده مسدود شده اید.",
                reply_parameters=ReplyParameters(quote=True)
            )
        
        get_user = await self.database.get_user(user_id=user_id)
        
        if not get_user:
            await self.database.add_user(user_id=user_id, start_date=self.timestamp, last_use=self.timestamp)
            get_user = await self.database.get_user(user_id=user_id)
        else:
            await self.database.update_user(get_user, last_use=self.timestamp)
        
        if not get_user.step:
            return
        
        get_arguments = get_user.step.split("|")
            
        if get_arguments[0] == "contact_us":
            markup = InlineKeyboardMarkup(
                [
                    [
                        InlineKeyboardButton("ریپلی بزنید", callback_data=f"support|{user_id}")
                    ]
                ]
            )
        
            admins = ADMINS.copy()
            
            async for admin in self.database.get_admins():
                rights = self.decode(admin.rights)
                
                if "support" in rights:
                    admins.append(admin.user_id)
                
            for admin in admins:
                await message.copy(
                    chat_id=admin,
                    caption=f"🧑🏻‍💻 پیام پشتیبانی\n🦢 کاربر: {user_id} - {message.from_user.mention}\n💌 پیام:\n{message.caption}",
                    reply_markup=markup
                )
                
            await self.database.update_user(get_user, step=None)
            await message.reply_text(
                text='🧑🏻‍💻 پیام شما با موفقیت برای ما ارسال شد، منتظر جواب آن باشید.',
                reply_markup=Buttons.home,
                reply_parameters=ReplyParameters(quote=True)
            )
            
        elif get_arguments[0] == "screenshot" and message.photo:
            get_withdraw = await self.database.get_withdraw(user_id=int(get_arguments[1]))
            
            await self.database.update_user(get_user, step="admin")
                
            if not get_withdraw:
                await message.reply_text(
                    text="💳 این درخواست دیگر وجود ندارد.",
                    reply_markup=Buttons.admin(user_id),
                    reply_parameters=ReplyParameters(quote=True)
                )
            else:
                get_arg_user = await self.database.get_user(user_id=get_withdraw.user_id)
                await self.database.update_user(get_arg_user, current_balance=get_arg_user.current_balance - get_withdraw.amount)
                
                try:
                    await message.copy(
                        chat_id=get_withdraw.user_id,
                        caption="🟢 درخواست برداشت شما توسط ادمین تایید شد."
                    )
                except:
                    pass
                
                await self.database.add_withdraw_history(user_id=get_arg_user.user_id, amount=get_withdraw.amount, date=self.timestamp)
                await self.database.delete_withdraw(get_withdraw.id)
                
                await message.reply_text(
                    text="💳 درخواست برداشت این کاربر تایید شد و فیش واریزی نیز برای کاربر ارسال شد.",
                    reply_markup=Buttons.admin(user_id),
                    reply_parameters=ReplyParameters(quote=True)
                )
        
        elif get_arguments[0] == "add_banner" and await self.is_admin(user_id, "banner"):
            await self.database.update_user(get_user, step=f"banner_name|{message.id}")
            await message.reply_text(
                text="☁️ نام بنر را ارسال کنید.",
                reply_markup=Buttons.back,
                reply_parameters=ReplyParameters(quote=True)
            )
            
        elif get_arguments[0] == "add_channel":
            if message.forward_origin and message.forward_origin.type == MessageOriginType.CHANNEL:
                chat_id = message.forward_origin.chat.id

            else:
                return await message.reply_text(
                    text='➕ <b>کانال</b> ارسال شده طبق <b>فرمت</b> های <b>تعریف</b> شده نمی باشد.',
                    reply_parameters=ReplyParameters(quote=True)
                )
            
            if not await self.bot_admin(chat_id):
                return await message.reply_text(
                    text='➕ <b>ربات</b> داخل کانال <b>ادمین</b> نمی باشد.',
                    reply_parameters=ReplyParameters(quote=True)
                )
            
            get_channel = await self.database.get_channel(chat_id=chat_id)

            if get_channel:
                if not get_channel.verify and get_channel.user_id == user_id:
                    return await message.reply_text(
                        text='➕ این <b>کانال</b> در دست <b>تایید</b> است.',
                        reply_parameters=ReplyParameters(quote=True)
                    )

                else:
                    return await message.reply_text(
                        text='➕ این <b>کانال</b> از قبل <b>ارسال</b> شده است.',
                        reply_parameters=ReplyParameters(quote=True)
                    )
                
            tag = self.string_generator()
            markup = InlineKeyboardMarkup(
                [
                    [
                        InlineKeyboardButton("لغو 🔴", callback_data=f"add_channel|cancel|{tag}"),
                        InlineKeyboardButton("🟢 تایید", callback_data=f"add_channel|confirm|{tag}")
                    ],
                    [
                        InlineKeyboardButton("✉️ پیام به کاربر", callback_data=f"admin_message|{tag}")
                    ]
                ]
            )
                
            try:
                get_chat = await self.client.get_chat(chat_id)
                title = get_chat.title
                link = get_chat.invite_link
            except:
                title = "-"
                link = "-"

            username = f" - <b>@{message.from_user.username}</b>" if message.from_user.username else ""
            
            admins = ADMINS.copy()
            async for admin in self.database.get_admins():
                rights = self.decode(admin.rights)
                
                if "channels" in rights:
                    admins.append(admin.user_id)

            for admin in admins:
                try:
                    await self.client.send_message(
                        chat_id=admin,
                        text=f"🐋 ثبت کانال\n\n🦢 کاربر: <code>{user_id}</code> - <b>{message.from_user.mention}</b>{username}\n♻️ کانال:\n\n💡 آیدی کانال: <code>{chat_id}</code>\n🧾 نام کانال: <b>{escape(title)}</b>\n🔗 لینک کانال: {link}\n🔖 نوع کانال: <b>{self.channel_type(get_arguments[1])}</b>",
                        reply_markup=markup
                    )
                except Exception as e:
                    print(e)
                    pass

            await self.database.add_channel(user_id=user_id, chat_id=chat_id, channel_type=int(get_arguments[1]), tag=tag)
            await message.reply_text(
                text='➕ کانال شما با <b>موفقیت</b> اضافه شد و پس از <b>تایید</b> شدن توسط <b>مدیر،</b> در <b>لیست کانال</b> های شما نمایش داده می شود.\n➿ در صورت اضافه کردن <b>کانال بعدی،</b> آن را ارسال کنید و در غیر این صورت روی دکمه ی <b>بازگشت</b> ضربه بزنید.',
                reply_parameters=ReplyParameters(quote=True)
            )

        elif get_arguments[0] == "edit_banner_value" and get_arguments[2] == "id" and await self.is_admin(user_id, "banner"):
            get_banner = await self.database.get_banner(tag=get_arguments[1])
            
            if not get_banner:
                await self.database.update_user(get_user, step="admin")
                return await message.reply(
                    text="☁️ بنر اشتباه می باشد.",
                    reply_markup=Buttons.admin(user_id, await self.admin_rights(user_id)),
                    reply_parameters=ReplyParameters(message_id=message.id)
                )
                
            elif get_banner.status != 0:
                await self.database.update_user(get_user, step="show_banner")
                return await message.reply(
                    text="☁️ این بنر حسابرسی شده است.",
                    reply_markup=Buttons.admin(user_id, await self.admin_rights(user_id)),
                    reply_parameters=ReplyParameters(message_id=message.id)
                )
            
            try:
                sent_message = await self.client.forward_messages(
                    chat_id=self.setting.banner_channel,
                    from_chat_id=user_id,
                    message_ids=message.id
                )
            except:
                return await message.reply(
                    text="☁️ ربات در کانال بنر ادمین نیست.",
                    reply_parameters=ReplyParameters(message_id=message.id)
                )
            
            await self.database.update_banner(get_banner, msg_id=sent_message.id)
                
            if get_banner.banner_limit == 0:
                banner_limit = "نامحدود"
            else:
                banner_limit = f"{get_banner.banner_limit:,}"
            
            get_seens = await self.database.get_all_seens_count(banner_tag=get_banner.tag)
            
            if get_banner.banner_end == 1:
                banner_count = f"➿ ظرفیت: <b>{get_banner.count:,}</b>"
                banner_left = f"<b>{get_banner.count - get_seens:,}</b>"
            else:
                banner_count = f"🕐 زمان: <b>{get_banner.count:,} روز</b>"
                banner_left = f"<b>{(get_banner.count - (self.timestamp - get_banner.date) // 86400):,} روز</b>"
                
            if get_banner.banner_limit == 0 or await self.database.get_seens_count(banner_tag=get_banner.tag) < get_banner.banner_limit:
                status = "✅"
            else:
                status = "❌"
                    
            await self.database.update_user(get_user, step=f"edit_banner|{get_banner.tag}")
            await message.reply(
                text=f"""💡 مقدار جدید با موفقیت ثبت شد.

🕯 نام: <b>{escape(get_banner.banner_name)}</b>

🌀 محدودیت بنر: <b>{banner_limit}</b>
🔖 نوع کانال: <b>{' - '.join(list(map(lambda x: self.channel_type(x), self.decode(get_banner.channel_type))))}</b>

{banner_count}
✔️ سین کل: <b>{get_seens:,}</b>
〰️ باقی مانده: {banner_left}

💵 نرخ 1000 سین: <b>{get_banner.s1000:,} تومان</b>
💰 درآمد کل: <b>{round((get_seens / 1000) * get_banner.s1000):,} تومان</b>

⚜️ قابل دریافت: {status}
📆 تاریخ ساخت: <b>{self.jalali_date(get_banner.date)}</b>

〽️ توضیحات: <b>{get_banner.description}</b>""",
                reply_markup=Buttons.edit_banner,
                reply_parameters=ReplyParameters(message_id=message.id)
            )
                    