import telebot
from telebot import types
import time
import sqlite3
import re

bot = telebot.TeleBot('секрет')  


conn = sqlite3.connect('eblans.db', check_same_thread=False)
cursor = conn.cursor()

# бан ворды
bad_words = ['как скачать', 'дай тутор', 'дай чит']


def get_admins(chat_id):
    cursor.execute("SELECT user_id FROM admins WHERE chat_id = ?", (chat_id,))
    return [row[0] for row in cursor.fetchall()]

def is_admin(chat_id, user_id):
    cursor.execute("SELECT * FROM admins WHERE chat_id = ? AND user_id = ?", (chat_id, user_id))
    return cursor.fetchone() is not None

def add_admin(chat_id, user_id):
    cursor.execute("INSERT OR IGNORE INTO admins (chat_id, user_id) VALUES (?, ?)", (chat_id, user_id))
    conn.commit()

def remove_admin(chat_id, user_id):
    cursor.execute("DELETE FROM admins WHERE chat_id = ? AND user_id = ?", (chat_id, user_id))
    conn.commit()

def update_permissions(chat_id, user_id, can_mute=None, can_ban=None, can_mention=None):
    if can_mute is not None:
        cursor.execute("UPDATE admins SET can_mute = ? WHERE chat_id = ? AND user_id = ?", (can_mute, chat_id, user_id))
    if can_ban is not None:
        cursor.execute("UPDATE admins SET can_ban = ? WHERE chat_id = ? AND user_id = ?", (can_ban, chat_id, user_id))
    if can_mention is not None:
        cursor.execute("UPDATE admins SET can_mention = ? WHERE chat_id = ? AND user_id = ?", (can_mention, chat_id, user_id))
    conn.commit()

def parse_duration(duration_str):
    pattern = r'^(\d+)([mhd])$'
    match = re.match(pattern, duration_str.lower())
    if not match:
        return None
    value, unit = match.groups()
    value = int(value)
    if unit == 'm':
        return value * 60
    elif unit == 'h':
        return value * 3600
    elif unit == 'd':
        if value > 30:
            return 30 * 86400  # Max 30 days
        return value * 86400
    return None

def check_message(message):
    if message.text:
        message_text = message.text.lower()
        for word in bad_words:
            if word in message_text:
                return True
    return False



# /inf инфо
@bot.message_handler(commands=['inf'])
def inf_command(message):
    try:
        if message.reply_to_message:
            user = message.reply_to_message.from_user
        else:
            args = message.text.split()
            if len(args) > 1:
                user = None
                
                mention = args[1]
                match = re.match(r'^@?(\d+)$', mention)
                if match:
                    user_id = int(match.group(1))
                    user = bot.get_chat_member(message.chat.id, user_id).user
                else:
                    
                    user = message.entities[0].user
            else:
                user = message.from_user

        if user:
            user_info = f"""
<b>User Information:</b>
• <b>Username:</b> @{user.username} 
• <b>Name:</b> {user.first_name} {user.last_name or ''}
• <b>ID:</b> {user.id}
"""
            bot.send_message(message.chat.id, user_info, parse_mode='HTML')
        else:
            bot.reply_to(message, "Не удалось найти пользователя.")
    except Exception as e:
        bot.reply_to(message, f"Ошибка: {e}")

# /eblan мут
@bot.message_handler(commands=['eblan'])
def mute_user(message):
    chat_id = message.chat.id
    user_id = message.from_user.id

    if not is_admin(chat_id, user_id):
        bot.send_message(chat_id, 'У вас нет доступа к этой команде.')
        return

    if not message.reply_to_message:
        bot.reply_to(message, "Пожалуйста, используйте команду в ответе на сообщение пользователя, которого хотите заткнуть.")
        return

    target_user = message.reply_to_message.from_user
    target_user_id = target_user.id


    if is_admin(chat_id, target_user_id) or target_user_id == bot.get_me().id:
        bot.reply_to(message, "Ты еблан? Админы не ебланы")
        return

    args = message.text.split()[1:]
    duration = 60  
    reason = " "

    if args:
        duration_input = args[0]
        duration_sec = parse_duration(duration_input)
        if duration_sec is None:
            bot.reply_to(message, "Неправильный формат времени.\nПример: /eblan 3d Причина")
            return
        duration = duration_sec
        if len(args) > 1:
            reason = 'Причина: '.join(args[1:])

    try:
        bot.restrict_chat_member(
            chat_id,
            target_user_id,
            can_send_messages=False,
            can_send_media_messages=False,
            can_send_other_messages=False,
            can_add_web_page_previews=False,
            until_date=int(time.time()) + duration
        )
        readable_duration = ""
        if duration >= 86400:
            days = duration // 86400
            readable_duration = f"{days} день(дней)"
        elif duration >= 3600:
            hours = duration // 3600
            readable_duration = f"{hours} час(ов)"
        else:
            minutes = duration // 60
            readable_duration = f"{minutes} минут(ы)"
        
        bot.reply_to(message, f"Еблан {target_user.first_name} заткнут на {readable_duration}. {reason}")
    except telebot.apihelper.ApiException as e:
        bot.send_message(chat_id, f"Не удалось заткнуть пользователя: {e}")


@bot.message_handler(commands=['uneblan'])
def unmute_user(message):
    chat_id = message.chat.id
    user_id = message.from_user.id

    if not is_admin(chat_id, user_id):
        bot.send_message(chat_id, 'У вас нет доступа к этой команде.')
        return

    if not message.reply_to_message:
        bot.reply_to(message, "Пожалуйста, используйте команду в ответе на сообщение пользователя, которого хотите разебланить.")
        return

    target_user = message.reply_to_message.from_user
    target_user_id = target_user.id

    try:
        bot.restrict_chat_member(
            chat_id,
            target_user_id,
            can_send_messages=True,
            can_send_media_messages=True,
            can_send_other_messages=True,
            can_add_web_page_previews=True
        )
        bot.reply_to(message, f"Еблан {target_user.first_name} разебланен.")
    except telebot.apihelper.ApiException as e:
        bot.send_message(chat_id, f"Не удалось разебланить пользователя: {e}")

# /ebalan228 бан нахуй
@bot.message_handler(commands=['ebalan228'])
def ban_user(message):
    chat_id = message.chat.id
    user_id = message.from_user.id

    if not is_admin(chat_id, user_id):
        bot.send_message(chat_id, 'У вас нет доступа к этой команде.')
        return

    if not message.reply_to_message:
        bot.reply_to(message, "Пожалуйста, используйте команду в ответе на сообщение пользователя, которого хотите забанить.")
        return

    target_user = message.reply_to_message.from_user
    target_user_id = target_user.id

    
    if is_admin(chat_id, target_user_id) or target_user_id == bot.get_me().id:
        bot.reply_to(message, "Нельзя банить администраторов или бота.")
        return

    args = message.text.split()[1:]
    reason = " "

    if args:
        reason = 'Причина: '.join(args)

    try:
        bot.kick_chat_member(chat_id, target_user_id, revoke_messages=True)
        bot.send_message(chat_id, f"Eblan {target_user.first_name} забанен. {reason}")
    except telebot.apihelper.ApiException as e:
        bot.send_message(chat_id, f"Не удалось забанить пользователя: {e}")


@bot.message_handler(commands=['settings'])
def settings_command(message):
    user_id = message.from_user.id
    chat_id = message.chat.id

    if chat_id > 0:
        
        return

    if not is_admin(chat_id, user_id):
        bot.send_message(chat_id, 'У вас нет доступа к этой команде.')
        return


    markup = types.InlineKeyboardMarkup()
    markup.add(types.InlineKeyboardButton("Администрация", callback_data="admin_settings"))
    bot.send_message(user_id, "Настройки чата:", reply_markup=markup)


@bot.callback_query_handler(func=lambda call: True)
def handle_callback(call):
    if call.data == "admin_settings":
        markup = types.InlineKeyboardMarkup()
        markup.add(
            types.InlineKeyboardButton("Добавить админа", callback_data="add_admin"),
            types.InlineKeyboardButton("Убрать админа", callback_data="remove_admin")
        )
        markup.add(
            types.InlineKeyboardButton("Список админов", callback_data="list_admins"),
            types.InlineKeyboardButton("Разрешения", callback_data="permissions")
        )
        bot.edit_message_text("Администрация:", chat_id=call.message.chat.id, message_id=call.message.message_id, reply_markup=markup)
    
    elif call.data == "add_admin":
        bot.send_message(call.message.chat.id, "Введите ID пользователя (@123456789):")
        bot.register_next_step_handler(call.message, process_add_admin)
    
    elif call.data == "remove_admin":
        bot.send_message(call.message.chat.id, "Введите ID пользователя (@123456789) для удаления из админов:")
        bot.register_next_step_handler(call.message, process_remove_admin)
    
    elif call.data == "list_admins":
        chat_id = call.message.chat.id
        admins = get_admins(chat_id)
        if admins:
            admin_list = "\n".join([f"• {admin_id}" for admin_id in admins])
            bot.send_message(call.message.chat.id, f"Список админов:\n{admin_list}")
        else:
            bot.send_message(call.message.chat.id, "Нет админов в этом чате.")
    
    elif call.data == "permissions":
        chat_id = call.message.chat.id
        markup = types.InlineKeyboardMarkup()
        markup.add(
            types.InlineKeyboardButton("Назад", callback_data="admin_settings")
        )
        bot.send_message(call.message.chat.id, "Выберите админа для настройки разрешений:", reply_markup=markup)


def process_add_admin(message):
    chat_id = message.chat.id
    admin_input = message.text.strip()
    match = re.match(r'^@?(\d+)$', admin_input)
    if match:
        admin_id = int(match.group(1))
        add_admin(chat_id, admin_id)
        bot.send_message(chat_id, f"Пользователь {admin_id} добавлен в администраторы.")
    else:
        bot.send_message(chat_id, "Неправильный формат ID. Пожалуйста, используйте числовой ID.")
    
def process_remove_admin(message):
    chat_id = message.chat.id
    admin_input = message.text.strip()
    match = re.match(r'^@?(\d+)$', admin_input)
    if match:
        admin_id = int(match.group(1))
        remove_admin(chat_id, admin_id)
        bot.send_message(chat_id, f"Пользователь {admin_id} удален из администраторов.")
    else:
        bot.send_message(chat_id, "Неправильный формат ID. Пожалуйста, используйте числовой ID.")


@bot.message_handler(func=lambda message: True)
def handle_message(message):
    if message.text and check_message(message):
        chat_id = message.chat.id
        user_id = message.from_user.id

        
        if is_admin(chat_id, user_id):
            return

        try:
            bot.ban_chat_member(chat_id, user_id)
            bot.send_message(chat_id, f"Eblan Detected - {message.from_user.first_name} banned.")
        except telebot.apihelper.ApiException as e:
            bot.send_message(chat_id, f"Не удалось забанить пользователя: {e}")
    else:
        if message.text:
            print(message.text)


bot.infinity_polling() сделай так, чтобы причина (слово) появлялась после того, как его напишут после команды, а если нет, то не пишется и еще, надо добавить код создатель, где имеет польнвй доступ к командам и настройками чата