"""Tests for BookService"""

import pytest
import aiofiles.os as aios

from chitai.schemas import BookCreate
from chitai.services import BookService
from chitai.database import models as m


@pytest.mark.asyncio
class TestBookServiceCRUD:
    """Test CRUD operation for libraries."""

    async def test_update_book(
        self, books_service: BookService, test_library: m.Library
    ) -> None:
        book_data = BookCreate(
            library_id=1,
            title="Fellowship of the Ring",
            authors=["J.R.R Tolkien"],
            tags=["Fantasy"],
            identifiers={"isbn-13": "9780261102354"},
            pages=427,
        )

        book = await books_service.to_model_on_create(book_data.model_dump())
        assert isinstance(book, m.Book)

        # Add path manually as it won't be generated (not using the create function, but manually inserting into db)
        book.path = f"{test_library.root_path}/J.R.R Tolkien/The Fellowship of the Ring"
        await aios.makedirs(book.path) # type: ignore[arg-type]  

        books_service.repository.session.add(book)
        await books_service.repository.session.commit()
        await books_service.repository.session.refresh(book)

        await books_service.update_book(
            book.id,
            {
                "title": "The Fellowship of the Ring",
                "identifiers": {"isbn-10": "9780261102354"},
                "edition": 3,
                "publisher": "Tolkien Estate",
                "series": "The Lord of the Rings",
                "series_position": "1",
                "tags": ["Fantasy", "Adventure"],
            },
            test_library,
        )

        updated_book = await books_service.get(book.id)

        # Assert updated information is correct

        assert updated_book.title == "The Fellowship of the Ring"
        assert (
            updated_book.path
            == f"{test_library.root_path}/J.R.R Tolkien/The Lord of the Rings/01 - The Fellowship of the Ring"
        )

        assert len(updated_book.identifiers)
        assert updated_book.identifiers[0].value == "9780261102354"

        assert updated_book.edition == 3
        assert updated_book.publisher is not None
        assert updated_book.publisher.name == "Tolkien Estate"

        assert len(updated_book.tags) == 2
