import datetime
import os
from telegram.ext import ConversationHandler, CommandHandler, MessageHandler, filters, CallbackQueryHandler
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
DATE_CHOICE, DATE_ENTRY, CONTENT = range(3)


class JournalHandler:
    def __init__(self, entry_string, models):
        self.models = models

        self.handler = ConversationHandler(
            entry_points=[CommandHandler(entry_string, self.start)],
            states={
                DATE_CHOICE: [
                    CallbackQueryHandler(self.date_choice),
                    ],
                DATE_ENTRY: [
                    MessageHandler(filters.TEXT, self.date_entry),
                    ],
                CONTENT: [
                    MessageHandler(filters.TEXT, self.content_text),
                    MessageHandler(filters.ATTACHMENT, self.content_media),
                    ],
            },
            fallbacks=[],
        )

        self.current_model = None


    async def start(self, update, context):
        """Send a message when the command /start is issued."""
        print(f"User: {update.message.from_user.id}")
        print(f"Chat: {update.message.chat_id}")

        if os.getenv("DOCKERIZED", "false") == "true" and os.getenv("CHAT_ID") != str(update.message.chat_id):
            await update.message.reply_text("You are not authorized to use this bot")
            return ConversationHandler.END


        options = [
            InlineKeyboardButton("Today", callback_data="today"),
            InlineKeyboardButton("Yesterday", callback_data="yesterday"),
            InlineKeyboardButton("Custom date", callback_data="custom"),
        ]
        keyboard = InlineKeyboardMarkup([options])
        await update.message.reply_text("Please choose an option for the entry:", reply_markup=keyboard)
        return DATE_CHOICE


    async def date_choice(self, update, context):
        query = update.callback_query
        await query.answer()
        if query.data == "today" or query.data == "yesterday":
            date = datetime.datetime.now().date() if query.data == "today" else datetime.datetime.now().date() - datetime.timedelta(days=1)
            self.current_model, new = self.models.JournalEntry.get_or_create(
                date = date
            )
            if not new:
                await query.edit_message_text(text="An entry already exists for this date")
                return ConversationHandler.END
            await query.edit_message_text(
                text="Please enter the content for the entry"
            )
            return CONTENT
        else:
            await query.edit_message_text(text="Please enter the date in the format DDMMYYYY")
            return DATE_ENTRY

    async def date_entry(self, update, context):
        date = update.message.text
        try:
            date = datetime.datetime.strptime(date, "%d%m%Y").date()
            self.current_model, new = self.models.JournalEntry.get_or_create(
                date = date
            )
            if not new:
                await update.message.reply_text("An entry already exists for this date")
                return ConversationHandler.END
        except ValueError:
            await update.message.reply_text("Please enter the date in the format DDMMYYYY")
            return DATE_ENTRY

        await update.message.reply_text("Please enter the content for the entry")
        return CONTENT


    async def content_text(self, update, context):
        self.current_model.text = update.message.text
        self.current_model.author_id = update.message.from_user.id
        self.current_model.save()
        return ConversationHandler.END

    
    async def content_media(self, update, context):
        self.current_model.author_id = update.message.from_user.id

        if update.message.photo:
            file = await update.message.effective_attachment[-1].get_file()
        else:
            file = await update.message.effective_attachment.get_file()
        
        file_bytes = await file.download_as_bytearray()
        file_path = file.file_path
        self.current_model.save_media(file_bytes, file_path)

        self.current_model.text = update.message.caption
        self.current_model.save()
        return ConversationHandler.END