import imghdr
import os

from discord_embed import __version__, settings
from discord_embed.generate_html import generate_html_for_videos
from discord_embed.main import app
from discord_embed.video import make_thumbnail, video_resolution
from discord_embed.webhook import send_webhook
from fastapi.testclient import TestClient

client = TestClient(app)
TEST_FILE = "tests/test.mp4"


def test_version():
    """Test that version is correct."""
    assert __version__ == "1.0.0"


def test_domain_ends_with_slash():
    """Test that domain ends with slash."""
    assert not settings.serve_domain.endswith("/")


def test_generate_html_for_videos():
    """Test that generate_html_for_videos() works."""
    # TODO: We should probably import this from settings.py instead of
    # hardcoding it here. If we change it in settings.py, it won't be
    # changed here.

    domain = os.environ["SERVE_DOMAIN"]

    # Remove trailing slash from domain
    if domain.endswith("/"):
        domain = domain[:-1]

    generated_html = generate_html_for_videos(
        url="https://www.youtube.com/watch?v=dQw4w9WgXcQ",
        width=1920,
        height=1080,
        screenshot="https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
        filename="test_video.mp4",
    )
    assert generated_html == f"{domain}/test_video.mp4"


def test_video_resolution():
    """Test that video_resolution() works."""
    assert video_resolution(TEST_FILE) == (422, 422)


def test_make_thumbnail():
    """Test that make_thumbnail() works."""
    # TODO: We should probably import this from settings.py instead of
    # hardcoding it here. If we change it in settings.py, it won't be
    # changed here.

    domain = os.environ["SERVE_DOMAIN"]

    # Remove trailing slash from domain
    if domain.endswith("/"):
        domain = domain[:-1]

    thumbnail = make_thumbnail(TEST_FILE, "test.mp4")
    # Check that thumbnail is a jpeg.
    assert imghdr.what(f"{settings.upload_folder}/test.mp4.jpg") == "jpeg"

    # Check that the it returns the correct URL.
    assert thumbnail == f"{domain}/test.mp4.jpg"


def test_save_to_disk():
    """Test that save_to_disk() works."""
    # TODO: Implement this test. I need to mock the UploadFile object.


def test_do_things():
    """Test that do_things() works."""
    # TODO: Implement this test. I need to mock the UploadFile object.


def test_send_webhook():
    """Test that send_webhook() works."""
    send_webhook("Running Pytest")


def test_main():
    """Test that main() works."""
    data_without_trailing_nl = ""
    response = client.get("/")

    # Check if response is our HTML.
    with open("templates/index.html", encoding="utf8") as our_html:
        data = our_html.read()

        # index.html has a trailing newline that we need to remove.
        if data[-1:] == "\n":
            data_without_trailing_nl = data[:-1]

    assert response.status_code == 200
    assert response.text == data_without_trailing_nl


def test_upload_file():
    """Test if we can upload files."""
    # TODO: We should probably import this from settings.py instead of
    # hardcoding it here. If we change it in settings.py, it won't be
    # changed here.

    domain = os.environ["SERVE_DOMAIN"]

    # Remove trailing slash from domain
    if domain.endswith("/"):
        domain = domain[:-1]

    # Upload our video file and check if it returns the html_url.
    with open(TEST_FILE, "rb") as uploaded_file:
        response = client.post(
            url="/uploadfiles/",
            files={"file": uploaded_file},
        )
        returned_json = response.json()
        html_url = returned_json["html_url"]

    assert response.status_code == 200
    assert html_url == f"{domain}/test.mp4"