# Импорт необходимых библиотек
from aiohttp import web
import aiomysql
import aiohttp

# Конфигурация подключения к базе данных
DB_CONFIG = {
    'host': 'localhost',
    'port': 3306,
    'user': 'root',
    'password': '7GmCyoOL4zI6t2V0',
    'db': 'pos_bot',
    'charset': 'utf8mb4',
    'autocommit': True
}

# Асинхронная функция для инициализации пула подключений к базе данных
async def init_db_pool(app):
    app['db_pool'] = await aiomysql.create_pool(**DB_CONFIG)

# Асинхронная функция для завершения работы с пулом подключений к базе данных
async def close_db_pool(app):
    app['db_pool'].close()
    await app['db_pool'].wait_closed()

# Асинхронная функция для получения информации о книге
async def get_book(request):
    book_code = request.query.get('book_code')
    if not book_code or not book_code.isdigit():
        return web.json_response({'error': 'Invalid book_code parameter'}, status=400)

    book_code = int(book_code)
    async with request.app['db_pool'].acquire() as conn:
        async with conn.cursor(aiomysql.DictCursor) as cursor:
            await cursor.execute("SELECT * FROM `popular_all` WHERE `book_code` > %s ORDER BY `book_code` ASC LIMIT 1", (book_code,))
            book = await cursor.fetchone()
            if book is None:
                return web.json_response({'error': 'Book not found'}, status=404)
    return web.json_response(book)

# Асинхронная функция для получения информации о новеллах
async def get_novel(request):
    book_code = request.query.get('book_code')
    if not book_code or not book_code.isdigit():
        return web.json_response({'error': 'Invalid book_code parameter'}, status=400)

    book_code = int(book_code)
    async with request.app['db_pool'].acquire() as conn:
        async with conn.cursor(aiomysql.DictCursor) as cursor:
            await cursor.execute("SELECT * FROM `popular_all` WHERE `book_code` > %s AND `book_type` = 'новелла' ORDER BY `book_code` ASC LIMIT 1", (book_code,))
            book = await cursor.fetchone()
            if book is None:
                return web.json_response({'error': 'Book not found'}, status=404)
    return web.json_response(book)

# Асинхронная функция для получения информации о фанфиках
async def get_fanfic(request):
        book_code = request.query.get('book_code')
        if not book_code or not book_code.isdigit():
            return web.json_response({'error': 'Invalid book_code parameter'}, status=400)

        book_code = int(book_code)
        async with request.app['db_pool'].acquire() as conn:
            async with conn.cursor(aiomysql.DictCursor) as cursor:
                await cursor.execute("SELECT * FROM `popular_all` WHERE `book_code` > %s AND `book_type` = 'фанфик' ORDER BY `book_code` ASC LIMIT 1", (book_code,))
                book = await cursor.fetchone()
                if book is None:
                    return web.json_response({'error': 'Book not found'}, status=404)
        return web.json_response(book)

# Создание экземпляра приложения aiohttp
app = web.Application()

# Добавление маршрутов и обработчиков
app.add_routes([web.get('/get-books', get_book)])
app.add_routes([web.get('/get-novel', get_novel)])
app.add_routes([web.get('/get-fanfic', get_fanfic)])
app.router.add_static('/', path='/var/www/ranobepluskn_usr3/data/www/ranobeplusknigi.ru', name='static', show_index=True)

# Настройка сигналов для инициализации и завершения пула подключений
app.on_startup.append(init_db_pool)
app.on_cleanup.append(close_db_pool)

# Точка входа для запуска приложения
if __name__ == '__main__':
    web.run_app(app, host='127.0.0.1', port=8080)