import json
import logging
import os
import traceback
from time import sleep

from telegram import Bot, InlineKeyboardMarkup, InlineKeyboardButton
from telegram.error import RetryAfter

from config.celery import app
from djconfig import config


@app.task(bind=True)
def upload_image_rpc(self, queued_image_pk, fpath, caption):
    from .modules.channel_helper import QueuedItem
    config._reload()
    try:
        logging.warning(f'Processing upload task for queued item #{queued_image_pk}')
        qi = QueuedItem.objects.get(pk=queued_image_pk)
        bot = qi.config.bot.get_bot()
        if qi.config.queued:
            m = bot.send_photo(
                config.tmp_uploads_chat_id,
                open(fpath, 'rb'),
                caption=caption,
                reply_markup=InlineKeyboardMarkup([[
                    InlineKeyboardButton('Delete', callback_data=f'del {queued_image_pk}')
                ]]),
            )
            qi.message_id = m.message_id
            qi.args = json.dumps([m.photo[-1].file_id])
            qi.save()
        else:
            bot.send_photo(
                qi.config.chat_id,
                open(fpath, 'rb'),
                caption=caption,
            )
            qi.processed = True
            qi.save()
        os.unlink(fpath)
        sleep(.3)
    except RetryAfter as e:
        raise self.retry(exc=e, countdown=int(e.retry_after))
    except Exception as e:
        traceback.print_exc()
        raise self.retry(exc=e, countdown=5)


@app.task(bind=True)
def upload_animation_rpc(self, queued_image_pk, fpath, caption):
    from .modules.channel_helper import QueuedItem
    config._reload()
    try:
        logging.warning(f'Processing upload task for queued animation item #{queued_image_pk}')
        qi = QueuedItem.objects.get(pk=queued_image_pk)
        bot = qi.config.bot.get_bot()
        if qi.config.queued:
            m = bot.send_animation(
                config.tmp_uploads_chat_id,
                open(fpath, 'rb'),
                caption=caption,
                reply_markup=InlineKeyboardMarkup([[
                    InlineKeyboardButton('Delete', callback_data=f'del {queued_image_pk}')
                ]]),
            )
            qi.message_id = m.message_id
            qi.args = json.dumps([m.animation.file_id])
            qi.save()
        else:
            bot.send_animation(
                qi.config.chat_id,
                open(fpath, 'rb'),
                caption=caption,
            )
            qi.processed = True
            qi.save()
        os.unlink(fpath)
    except RetryAfter as e:
        raise self.retry(exc=e, countdown=int(e.retry_after))
    except Exception as e:
        traceback.print_exc()
        raise self.retry(exc=e, countdown=5)
