from aiogram import types
from create_bot import bot, dp
import random
from random import randint
import datetime
from dicktxt import ForReadDict, WordsChange
from pipisa_functions import pipisa_time

from global_conf import CONFIG

#### https://docs.python-arango.com/en/main/
from arango import ArangoClient

admins = CONFIG['telegram_admins_ids']


def get_dicks_collection(): 
    arango_client = ArangoClient(hosts=CONFIG['databaso']['host'] ) 
    pipisa_db     = arango_client.db(
        CONFIG['databaso']['base'], 
        username=CONFIG['databaso']['user'],
        password=CONFIG['databaso']['pass']
    ) 
    dicks_collection = pipisa_db.collection(CONFIG['databaso']['collection']) 

    return dicks_collection


@dp.message_handler(commands=["dick"])
async def up_dick(message: types.Message):

    if message.from_user.id in admins or message.chat.type != 'private':

        dicks_collection = get_dicks_collection()

        #### TODO уплатить нолог с 100 см для самого нищего


        # рандомайзер
        result = randint(-9,10)

        try:
            #### Чекнуть есть ли юзер в базе
            candidate_cursor = dicks_collection.find(
                {
                    'user_id': message.from_user.id,
                    'chat_id': message.chat.id
                },
                skip=0, limit=1488)
    
            if candidate_cursor.count() > 0: 
                ## Если есть то нарастить и отправить сообщение

                user = candidate_cursor.pop()
    

                if pipisa_time.rolltime(check_datetime=user['datetimes'], curr_time=datetime.datetime.now()):
                    # пришло время крутить!!
    
                    updetedDick = user["dick_size"] + result 
                    try:
                        dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                        metadata = dicks_collection.insert(
                            {
                                '_key':          user['_key'], ### этот нужен чтобы апдейт прилетал тому же юзеру
                                'user_id':       user['user_id'],
                                'user_fullname': message.from_user.full_name,
                                'dick_size':     updetedDick,
                                'datetimes':     datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                                'attempts':      user['attempts'] + 1,
                                'chat_id':       message.chat.id
                            },
                            overwrite_mode='update'
                        )
                        print(f'Успешно апдейтнули пипису @{message.from_user.username}') 
                    except Exception as e2:
                        print(f'ошибка в обновлении пиписы @{message.from_user.username}')
                        print(e2) 

                    randomword    = ForReadDict.RandomDick() 
                    change_phrase = WordsChange.ChangeWord(result)

                    await bot.send_message(message.chat.id, f'@{message.from_user.username}, ваш <em>{randomword}</em> {change_phrase}\
на <b>{abs(result)}</b> см!\n\
Теперь он равен <b>{updetedDick}</b> см! ')
                else:
                    await bot.send_message(message.chat.id, f'@{message.from_user.username},🚫 вы уже крутили пипису, ее размер <b>{user["dick_size"]}</b> см! ')
                    
                    try:
                        metadata = dicks_collection.insert(
                            {
                                '_key':          user['_key'], ### этот нужен чтобы апдейт прилетал тому же юзеру
                                'user_id':       user['user_id'] ,
                                'user_fullname': message.from_user.full_name,
                                'dick_size':     user['dick_size'] ,
                                'datetimes':     user['datetimes'] ,
                                'attempts':      user['attempts'] + 1,
                                'chat_id':       message.chat.id
                            },
                            overwrite_mode='update'
                        )
                        print(f'Успешно апдейтнули попытку крутить пипису @{message.from_user.username}') 
                    except Exception as e2:
                        print(f'ошибка в обновлении попытки крутить пипису @{message.from_user.username}')
                        print(e2) 

                    print(f'пользователь @{message.from_user.username} уже крутил')

            else: 
                ## если нету, то создать 
    
                try: 
                    novenkiy = {
                        'user_id':       message.from_user.id,
                        'user_fullname': message.from_user.full_name,
                        'dick_size':     result,
                        'datetimes':     datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                        'attempts':      1,
                        'chat_id':       message.chat.id
                    }
    
                    metadata = dicks_collection.insert(novenkiy, overwrite_mode='update')
                

                    if result > 0:
                        await bot.send_message(message.chat.id, f'@{message.from_user.username}, ваш писюн показал головку 🚀\n\
на <b>{abs(result)}</b> см!\n\
Теперь он равен <b>{result}</b> см!') 
                    else:
                        await bot.send_message(message.chat.id, f'@{message.from_user.username}, добро пожаловать в игру!🚀\n\
Ты стартуешь не с лучшей позиции, природа наградила тебя всего <b>{result}</b> см 😬')
                        
                        
                    print(f'Успешно добавлен пользователь @{message.from_user.username}')
                except Exception as e1:
                    print('ошибка в добавлении нового пользователя')
                    print(e1) 


        except Exception as e: 
            print('ошибка DB в /dick')
            print(e)


        #### для всех отложенных сообщений
            ## проверить если прошло ?пять минут? с публикации
                ## попробовать удалить такой пост и затереть его с коллекции
            ## оставлять последние в чате топ- и глобал-дик, сохранять последние сообщения о приросте, сохранять последний вызов /dick и иной команды
    else:
        await message.reply('Растить елду можно только в общих чатах!')

 
 
        
    
@dp.message_handler(commands=["topdick"])
async def send_topchat(message: types.Message):
    if message.from_user.id in admins or message.chat.type != 'private':
 
        dicks_collection = get_dicks_collection()
        try:
            dicks = dicks_collection.find({'chat_id': message.chat.id}, skip=0, limit=1100)
            dicks = [d for d in dicks]
        except Exception as e: 
            print('ошибка DB в /topdick')
            print(e)

        top_dicks  = sorted(dicks, key=lambda dick: dick['dick_size'], reverse=True)
        
        dick_limit = min(len(top_dicks), 10)
        top_dicks  = top_dicks[:dick_limit]
    
        dickos = ''
        emo    = ['🏆','🚀','🍆','🍌','🐍','🐎','🌭','🌶','👌','💩']

        if len(top_dicks) == 0:
            await bot.send_message(message.chat.id, '🍆 Никто ничего не нарастил! 🍌')
        else:
            for i in range(len(top_dicks)): 
                dickos += f'     {emo[i]} {i+1}. {top_dicks[i]["user_fullname"]}: {top_dicks[i]["dick_size"]}см\n'
                i += 1

            await bot.send_message(message.chat.id, '🏆Топ 10 бубылд чата🏆\n\n' + dickos)
    else:
        await message.reply('Работает только в общих чатах!\n'\
                            'Вы мсжете посмотреть топ по миру /globaldick')




@dp.message_handler(commands=["globaldick"])
async def send_global_top(message: types.Message): 
    dicks_collection = get_dicks_collection()

    try:
        dicks = dicks_collection.all( ) 
        dicks = [d for d in dicks if d['user_id'] != d['chat_id']]
    except Exception as e: 
        print('ошибка DB в /glovaldick')
        print(e)

    top_dicks  = sorted(dicks, key=lambda dick: dick['dick_size'], reverse=True)
    

    dick_limit = min(len(top_dicks), 10)
    top_dicks  = top_dicks[:dick_limit]

    dickos = ''
    emo    = ['🏆','🚀','💫','🍆','🍌','🐍','🐎','🌭','🌶','👌']

    if len(top_dicks) == 0:
        await bot.send_message(message.chat.id, '🍆 Никто ничего не нарастил! 🍌')
    else:
        for i in range(len(top_dicks)): 
            dickos += f'     {emo[i]} {i+1}. {top_dicks[i]["user_fullname"]}: {top_dicks[i]["dick_size"]}см\n'
            i += 1

        await bot.send_message(message.chat.id, '🏆Топ 10 пипис в мире🏆\n\n' + dickos)