import logging
import shutil
from pathlib import Path
from uuid import uuid4

logger = logging.getLogger(__name__)

MAX_DIR_LEN = 48
MAX_FILE_LEN = 48


def organise_file(
    filepath_: str,
    storage_url: str,
    original_filename: str,
    metadata: dict,
) -> dict:
    """
    Move the incoming file into the storage, while preserving the original filename.

    If you import multiple copies of the same file, the behavior is:
    - The first filename is preserved.
    - The next filenames receive an uuid append to the name.
    """
    filepath = Path(filepath_)

    orig_filename = Path(original_filename)
    dest_path = Path(storage_url)

    # Building import path
    if "artist_name" in metadata:
        dest_path /= metadata["artist_name"][0:MAX_DIR_LEN]

    if "album_title" in metadata:
        dest_path /= metadata["album_title"][0:MAX_DIR_LEN]

    dest_path /= orig_filename.stem[0:MAX_FILE_LEN] + orig_filename.suffix

    # Handle when a file already exists
    if dest_path.is_file():
        if filepath.samefile(dest_path):
            metadata["full_path"] = str(dest_path)
            return metadata

        dest_path = dest_path.with_name(f"{dest_path.stem}_{uuid4()}{dest_path.suffix}")
        logger.warning("found existing file, using new filepath %s", dest_path)

    # Import
    dest_path.parent.mkdir(parents=True, exist_ok=True)

    logger.debug("moving %s to %s", filepath, dest_path)
    shutil.move(filepath, dest_path)

    metadata["full_path"] = str(dest_path)
    return metadata
