import shutil
from pathlib import Path

import pytest

from libretime_analyzer.pipeline.organise_file import organise_file

from ..conftest import AUDIO_FILENAME


def organise_file_args_factory(filepath: Path, dest_dir: Path):
    return (
        str(filepath),
        str(dest_dir),
        AUDIO_FILENAME,
        {},
    )


def test_organise_file(src_dir: Path, dest_dir: Path):
    organise_file(*organise_file_args_factory(src_dir / AUDIO_FILENAME, dest_dir))
    assert (dest_dir / AUDIO_FILENAME).exists()


def test_organise_file_samefile(src_dir: Path):
    organise_file(*organise_file_args_factory(src_dir / AUDIO_FILENAME, src_dir))
    assert (src_dir / AUDIO_FILENAME).exists()


def test_organise_file_duplicate_file(src_dir: Path, dest_dir: Path):
    for i in range(1, 4):
        # Make a copy so we can reuse the file
        filename = f"{i}_{AUDIO_FILENAME}"
        shutil.copy(src_dir / AUDIO_FILENAME, src_dir / filename)

        metadata = organise_file(
            *organise_file_args_factory(src_dir / filename, dest_dir)
        )

        full_path = Path(metadata["full_path"])
        assert full_path.exists()
        if i == 1:
            assert full_path.name == AUDIO_FILENAME
        else:
            assert len(full_path.name) == len(AUDIO_FILENAME) + 1 + 36  # _ + UUID size


def test_organise_file_bad_permissions_dest_dir(src_dir: Path):
    with pytest.raises(OSError):
        # /sys is using sysfs on Linux, which is unwritable
        organise_file(
            *organise_file_args_factory(
                src_dir / AUDIO_FILENAME,
                Path("/sys/foobar"),
            )
        )