import pytest
from apps.process.utils import ( get_audio_parts,
                            get_sec,
                            generate_name,
                            get_client_ip,
                            generate_thumbnail,
                            getlastmediauploaded)

from apps.process.models import ProcessedMedia
from apps.accounts.models import User

from datetime import datetime, timedelta

from unittest import mock
from django.test import RequestFactory
import cv2
import numpy as np



@pytest.mark.parametrize("part_list,expect_list",
                         [([[1200, 1400], [2300, 2600], [3200, 3400], [4200, 4800], [5100, 5300]],
                         [[0, 1200], [1200, 1400], [1400, 2300], [2300, 2600], [2600, 3200],
                         [3200, 3400], [3400, 4200], [4200, 4800], [4800, 5100], [5100, 5300],
                         [5300, 9000]]), ([[1, 2], [3, 4], [5, 6]], [[0, 1], [1, 2], [2, 3], [3, 4], [4, 5],
                         [5, 6], [6, 9000]])])

def test_get_audio_part_with_multi_parts(part_list,expect_list) -> None:
    assert get_audio_parts(9000, part_list) == expect_list

# @pytest.mark.skip(reason='Because not valid')
@pytest.mark.parametrize("part_list,expect", [([[1, 2]], [[0, 1],[1, 2], [2, 9000]])])
def test_get_audio_with_one_part(part_list, expect) -> None:
    assert get_audio_parts(9000, part_list) == expect


@pytest.mark.parametrize("seconds,expected_ms", [('00:00:02', 2000), ('00:00:30', 30000), ('00:01:09', 69000)])
def test_second_to_ms(seconds: str, expected_ms: int) -> None:
    assert get_sec(seconds) == expected_ms


@pytest.mark.xfail()
def test_wrong_time_format() -> None: # sepose to fail
    assert get_sec("01:01") == 69000


def test_get_client_ip(mocker):
    # create a mock request object
    request = mocker.Mock()
    # set the 'HTTP_X_FORWARDED_FOR' header
    request.META = {'HTTP_X_FORWARDED_FOR': '192.0.2.1, 198.51.100.2'}
    assert get_client_ip(request) == '192.0.2.1'
    # set the 'REMOTE_ADDR' header
    request.META = {'REMOTE_ADDR': '203.0.113.1'}
    assert get_client_ip(request) == '203.0.113.1'


def test_generate_name(filename):
    now = datetime.now().strftime("%H_%M_%S")
    expected_output = "my_file__1__" + now + ".mp4"
    assert generate_name(filename) == expected_output

@pytest.mark.django_db
@pytest.mark.skip
def test_getlastmediauploaded(media_factory,file_factory,normal_user_factory,processed_media_factory):
    factory = RequestFactory()
    request = factory.get('/')
    user = normal_user_factory.create()
    file = file_factory.create()
    media = media_factory.create(originl_file=file)
    video = processed_media_factory.create(media=media)
    video.uploaded_at = datetime.now() - timedelta(days=1)
    video.save()

    latest_video = getlastmediauploaded(request)
    assert latest_video == video

    video2 = processed_media_factory.create()
    video2.uploaded_at = datetime.now()
    video2.save()

    latest_video = getlastmediauploaded(request)
    assert latest_video == video2

    # empty_video = ProcessedMedia.objects.all().delete()

    latest_video = getlastmediauploaded(request)
    assert latest_video == None