import asyncio
import logging
import aiohttp

from aiogram import Bot, Dispatcher, types, F
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.utils.keyboard import InlineKeyboardBuilder


BOT_TOKEN = "ТОКЕН_БОТА" 


PRIVAT_API_URL = "https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5"


logging.basicConfig(level=logging.INFO)

bot = Bot(token=BOT_TOKEN)
dp = Dispatcher(storage=MemoryStorage())

class ConvertState(StatesGroup):
    waiting_for_currency = State()
    waiting_for_amount = State() 


async def get_exchange_rates():
    async with aiohttp.ClientSession() as session:
        async with session.get(PRIVAT_API_URL) as response:
            data = await response.json()
            rates = {}
            for item in data:
                rates[item['ccy']] = {
                    'buy': float(item['buy']),
                    'sale': float(item['sale'])
                }
            return rates

@dp.message(Command("start"))
async def cmd_start(message: types.Message, state: FSMContext):
    await state.clear() 
    
    builder = InlineKeyboardBuilder()
    builder.button(text="🇺🇸 USD", callback_data="USD")
    builder.button(text="🇪🇺 EUR", callback_data="EUR")
    builder.adjust(2) 

    await message.answer(
        "Привіт! Я конвертер валют. \nОбери валюту (курс ПриватБанку):",
        reply_markup=builder.as_markup()
    )
    await state.set_state(ConvertState.waiting_for_currency)


@dp.callback_query(ConvertState.waiting_for_currency)
async def currency_chosen(callback: types.CallbackQuery, state: FSMContext):
    currency = callback.data
    await state.update_data(selected_currency=currency)
    
    await callback.message.answer(f"Обрано **{currency}**. Напиши суму (наприклад: 100):")
    await callback.answer()
    await state.set_state(ConvertState.waiting_for_amount)

@dp.message(ConvertState.waiting_for_amount)
async def process_amount(message: types.Message, state: FSMContext):
    user_text = message.text.replace(',', '.') 
    
    try:
        amount = float(user_text)
    except ValueError:
        await message.answer("Це не схоже на число. Спробуй ще раз.")
        return


    data = await state.get_data()
    currency = data.get('selected_currency')

    try:
        rates = await get_exchange_rates()
        if currency not in rates:
            await message.answer("Помилка: курс для цієї валюти не знайдено.")
            return
            
        rate_buy = rates[currency]['buy']
        rate_sale = rates[currency]['sale']

        uah_needed = amount * rate_sale
        uah_received = amount * rate_buy

        response_text = (
            f"📊 **Конвертація {amount} {currency}:**\n"
            f"------------------------------\n"
            f"💵 Щоб купити: **{uah_needed:.2f} UAH**\n"
            f"💴 Якщо здати: **{uah_received:.2f} UAH**\n"
            f"------------------------------\n"
            f"_(Курс: {rate_buy} / {rate_sale})_"
        )
        
        builder = InlineKeyboardBuilder()
        builder.button(text="🔄 Інша сума/валюта", callback_data="restart")
        
        await message.answer(response_text, parse_mode="Markdown", reply_markup=builder.as_markup())
        await state.clear()
        
    except Exception as e:
        logging.error(f"Error: {e}")
        await message.answer("Не вдалося отримати дані від банку 😔")

@dp.callback_query(F.data == "restart")
async def restart_handler(callback: types.CallbackQuery, state: FSMContext):
    await cmd_start(callback.message, state)

async def main():
    print("Бот запущено!")
    await bot.delete_webhook(drop_pending_updates=True)
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())