from aiogram import types, Dispatcher
from sqlalchemy.orm.session import close_all_sessions
from create_bot import bot, dp
from sqdb import user, session
import random
from random import randint
import datetime
from dicktxt import ForReadDict


@dp.message_handler(commands=["dick"])
async def up_dick(message: types.Message):
# рандомайзер
    numb = randint(-6,10)
    global size_change, dick_plus, dick_minus
    dick_plus  = ('<b>вырос</b>', '<b>подрос</b>', '<b>привстал</b>')
    dick_minus = ('<b>уменьшился</b>', '<b>откусила злая гадюка</b>', '<b>продали евреи, он стал дешевле</b>')
    if numb > 0:
         size_change  = random.choice(dick_plus) + '🚀'
	#if numb = 0 size_change = random.choice(const)  TODO
    else: size_change = random.choice(dick_minus) + '✂'


# работа с таблицей
    try:
        b = session.query(user).filter(user.user_id == message.from_user.id).first()
        if b:
            last_time = b.datetimes
            now_time = datetime.datetime.now()
            diff = now_time.day - last_time.day
            
            if abs(diff) <= 0:
                try:
                    current_dick = b.dick_size
                    
                    
                    await bot.send_message(message.chat.id, f'@{message.from_user.username},🚫 вы уже крутили пипису, ее размер <b>{current_dick}</b> см! ')
                except:
                    print('ошибка в if diff <=0')
                    session.rollback()   
                finally: 
                    session.close_all()
                    print('пользователь уже крутил')
                    
            else:
                try:
                    a = session.query(user).filter(user.user_id == message.from_user.id).first() # запрос на поиск в таблице
                    updetedDick = a.dick_size = (a.dick_size + numb)
                    a.datetimes = datetime.datetime.now()
                    session.flush()
                    session.commit() #обновляет запись
                    randomword = ForReadDict.RandomDick()
                
                    await bot.send_message(message.chat.id, f'@{message.from_user.username}, ваш <em>{randomword}</em> {size_change}\
на <b>{abs(numb)}</b> см!\n\
Теперь он равен <b>{updetedDick}</b> см! ')
                except:
                    session.rollback()
                    print('ошибка в обновлении пиписы')
                finally:
                    session.close_all()
                    print('пиписа обновлена')
                
                    

        else:
            session.close()
            try:
                numb = randint(1,10)

                int_table = user(user_id = message.from_user.id, user_fullname = message.from_user.full_name, dick_size = numb, datetimes = datetime.datetime.now(),\
            chat_id = message.chat.id)

                session.add(int_table)
                session.flush()
                session.commit()
                session.close()
            
                await bot.send_message(message.chat.id, f'@{message.from_user.username}, ваш писюн показал головку 🚀\n\
на <b>{abs(numb)}</b> см!\n\
Теперь он равен <b>{numb}</b> см!')
            except:
                print('ошибка в добавлении нового пользователя')
                session.rollback()
            finally:
                session.close_all()
                print('Успешно добавлен пользователь')
        
    except:
        session.rollback()
        print('ошибка в основном коде')
    finally:
        session.close_all()
        
    
@dp.message_handler(commands=["topdick"])
async def send_topchat(message: types.Message):
    try:
        changechat_id = session.query(user).filter(user.user_id == message.from_user.id).first()
        chats = message.chat.id 
        if changechat_id.chat_id != chats:
            changechat_id.chat_id = chats
            session.commit()
            session.close()
        else:
            session.close()
            top = session.query(user.user_fullname, user.dick_size).order_by(user.dick_size.desc()).filter(user.chat_id == chats).limit(10).all()
            delimiter = ': '

    # проверка на длину списка, если меньше limit, то:

        sizelen = len(top)
        if sizelen < 10:
            lenminus = 10 - sizelen
            top.extend(('-'*lenminus))
            await bot.send_message(message.chat.id, f'🏆Топ 10 бубылд чата🏆\n\n\
    🚀 {delimiter.join(map(str, top[0]))}\n\
    💫 {delimiter.join(map(str, top[1]))}\n\
    🍆 {delimiter.join(map(str, top[2]))}\n\
    🍌 {delimiter.join(map(str, top[3]))}\n\
    🐍 {delimiter.join(map(str, top[4]))}\n\
    🐎 {delimiter.join(map(str, top[5]))}\n\
    🌭 {delimiter.join(map(str, top[6]))}\n\
    🌶 {delimiter.join(map(str, top[7]))}\n\
    👌 {delimiter.join(map(str, top[8]))}\n\
    💩 {delimiter.join(map(str, top[9]))}\n')
            session.close()
        # если все нормально и участников минимум 10

        else:
            
            await bot.send_message(message.chat.id, f'🏆Топ 10 бубылд чата🏆\n\n\
    🚀 {delimiter.join(map(str, top[0]))}\n\
    💫 {delimiter.join(map(str, top[1]))}\n\
    🍆 {delimiter.join(map(str, top[2]))}\n\
    🍌 {delimiter.join(map(str, top[3]))}\n\
    🐍 {delimiter.join(map(str, top[4]))}\n\
    🐎 {delimiter.join(map(str, top[5]))}\n\
    🌭 {delimiter.join(map(str, top[6]))}\n\
    🌶 {delimiter.join(map(str, top[7]))}\n\
    👌 {delimiter.join(map(str, top[8]))}\n\
    💩 {delimiter.join(map(str, top[9]))}\n')
    except:
        session.rollback()
        print('ошибка в /topdick')
    finally:
        session.close_all()



@dp.message_handler(commands=["globaldick"])
async def send_global_top(message: types.Message):
    try:
        top_chat = session.query(user.user_fullname, user.dick_size).order_by(user.dick_size.desc()).limit(10).all()
        
        delimiter = ': '
            
        
        await bot.send_message(message.chat.id, f'🏆Топ 10 пипис в мире🏆\n\n\
    1. {delimiter.join(map(str, top_chat[0]))}\n\
    2. {delimiter.join(map(str, top_chat[1]))}\n\
    3. {delimiter.join(map(str, top_chat[2]))}\n\
    4. {delimiter.join(map(str, top_chat[3]))}\n\
    5. {delimiter.join(map(str, top_chat[4]))}\n\
    6. {delimiter.join(map(str, top_chat[5]))}\n\
    7. {delimiter.join(map(str, top_chat[6]))}\n\
    8. {delimiter.join(map(str, top_chat[7]))}\n\
    9. {delimiter.join(map(str, top_chat[8]))}\n\
    10. {delimiter.join(map(str, top_chat[9]))}\n')
    except:
        session.rollback()
        print('ошибка в /glovaldick')
    finally:
        session.close_all()


# def register_handlers_pipisa(dp: Dispatcher):
#     dp.register_message_handler(up_dick)
#     dp.register_message_handler(send_topchat)
#     dp.register_message_handler(send_global_top)