import datetime
import pathlib

from langchain_community.chat_loaders import imessage, utils


def test_imessage_chat_loader_upgrade_osx11() -> None:
    chat_path = (
        pathlib.Path(__file__).parent / "data" / "imessage_chat_upgrade_osx_11.db"
    )
    loader = imessage.IMessageChatLoader(str(chat_path))

    chat_sessions = list(
        utils.map_ai_messages(loader.lazy_load(), sender="testemail@gmail.com")
    )
    assert chat_sessions, "Chat sessions should not be empty"

    assert chat_sessions[0]["messages"], "Chat messages should not be empty"

    first_message = chat_sessions[0]["messages"][0]
    # message content in text field
    assert "Yeh" in first_message.content, "Chat content mismatch"

    # time parsed correctly
    expected_message_time = 720845450393148160
    assert first_message.additional_kwargs["message_time"] == expected_message_time, (
        "unexpected time"
    )

    expected_parsed_time = datetime.datetime(2023, 11, 5, 2, 50, 50, 393148)
    assert (
        first_message.additional_kwargs["message_time_as_datetime"]
        == expected_parsed_time
    ), "date failed to parse"

    # is_from_me parsed correctly
    assert first_message.additional_kwargs["is_from_me"] is False, (
        "is_from_me failed to parse"
    )


def test_imessage_chat_loader() -> None:
    chat_path = pathlib.Path(__file__).parent / "data" / "imessage_chat.db"
    loader = imessage.IMessageChatLoader(str(chat_path))

    chat_sessions = list(
        utils.map_ai_messages(loader.lazy_load(), sender="testemail@gmail.com")
    )
    assert chat_sessions, "Chat sessions should not be empty"

    assert chat_sessions[0]["messages"], "Chat messages should not be empty"

    first_message = chat_sessions[0]["messages"][0]

    # message content in text field
    assert "Yeh" in first_message.content, "Chat content mismatch"

    # time parsed correctly
    expected_message_time = 720845450393148160
    assert first_message.additional_kwargs["message_time"] == expected_message_time, (
        "unexpected time"
    )

    expected_parsed_time = datetime.datetime(2023, 11, 5, 2, 50, 50, 393148)
    assert (
        first_message.additional_kwargs["message_time_as_datetime"]
        == expected_parsed_time
    ), "date failed to parse"

    # is_from_me parsed correctly
    assert first_message.additional_kwargs["is_from_me"] is False, (
        "is_from_me failed to parse"
    )

    # short message content in attributedBody field
    assert "John is the almighty" in chat_sessions[0]["messages"][16].content, (
        "Chat content mismatch"
    )

    # long message content in attributedBody field
    long_msg = "aaaaabbbbbaaaaabbbbbaaaaabbbbbaaaaabbbbbaaaaabbbbbaaaaabbbbbaaaaabbbbba"
    "aaaabbbbbaaaaabbbbbaaaaabbbbbaaaaabbbbbaaaaabbbbbaaaaabbb"
    assert long_msg in chat_sessions[0]["messages"][18].content, "Chat content mismatch"
