# encoding: utf-8

from __future__ import unicode_literals

from mopidy import compat

import pytest

from mopidy_local import translator


@pytest.mark.parametrize('local_uri,file_uri', [
    ('local:directory:A/B', 'file:///home/alice/Music/A/B'),
    ('local:directory:A%20B', 'file:///home/alice/Music/A%20B'),
    ('local:directory:A+B', 'file:///home/alice/Music/A%2BB'),
    (
        'local:directory:%C3%A6%C3%B8%C3%A5',
        'file:///home/alice/Music/%C3%A6%C3%B8%C3%A5'),
    ('local:track:A/B.mp3', 'file:///home/alice/Music/A/B.mp3'),
    ('local:track:A%20B.mp3', 'file:///home/alice/Music/A%20B.mp3'),
    ('local:track:A+B.mp3', 'file:///home/alice/Music/A%2BB.mp3'),
    (
        'local:track:%C3%A6%C3%B8%C3%A5.mp3',
        'file:///home/alice/Music/%C3%A6%C3%B8%C3%A5.mp3'),
])
def test_local_uri_to_file_uri(local_uri, file_uri):
    media_dir = b'/home/alice/Music'

    assert translator.local_uri_to_file_uri(local_uri, media_dir) == file_uri


@pytest.mark.parametrize('uri', [
    'A/B',
    'local:foo:A/B',
])
def test_local_uri_to_file_uri_errors(uri):
    media_dir = b'/home/alice/Music'

    with pytest.raises(ValueError):
        translator.local_uri_to_file_uri(uri, media_dir)


@pytest.mark.parametrize('uri,path', [
    ('local:directory:A/B', b'/home/alice/Music/A/B'),
    ('local:directory:A%20B', b'/home/alice/Music/A B'),
    ('local:directory:A+B', b'/home/alice/Music/A+B'),
    (
        'local:directory:%C3%A6%C3%B8%C3%A5',
        b'/home/alice/Music/\xc3\xa6\xc3\xb8\xc3\xa5'),
    ('local:track:A/B.mp3', b'/home/alice/Music/A/B.mp3'),
    ('local:track:A%20B.mp3', b'/home/alice/Music/A B.mp3'),
    ('local:track:A+B.mp3', b'/home/alice/Music/A+B.mp3'),
    (
        'local:track:%C3%A6%C3%B8%C3%A5.mp3',
        b'/home/alice/Music/\xc3\xa6\xc3\xb8\xc3\xa5.mp3'),
])
def test_local_uri_to_path(uri, path):
    media_dir = b'/home/alice/Music'

    assert translator.local_uri_to_path(uri, media_dir) == path

    # Legacy version to keep old versions of Mopidy-Local-Sqlite working
    assert translator.local_track_uri_to_path(uri, media_dir) == path


@pytest.mark.parametrize('uri', [
    'A/B',
    'local:foo:A/B',
])
def test_local_uri_to_path_errors(uri):
    media_dir = b'/home/alice/Music'

    with pytest.raises(ValueError):
        translator.local_uri_to_path(uri, media_dir)


@pytest.mark.parametrize('path,uri', [
    ('/foo', 'file:///foo'),
    (b'/foo', 'file:///foo'),
    ('/æøå', 'file:///%C3%A6%C3%B8%C3%A5'),
    (b'/\x00\x01\x02', 'file:///%00%01%02'),
])
def test_path_to_file_uri(path, uri):
    assert translator.path_to_file_uri(path) == uri


@pytest.mark.parametrize('path,uri', [
    ('foo', 'local:track:foo'),
    (b'foo', 'local:track:foo'),
    ('æøå', 'local:track:%C3%A6%C3%B8%C3%A5'),
    (b'\x00\x01\x02', 'local:track:%00%01%02'),
])
def test_path_to_local_track_uri(path, uri):
    result = translator.path_to_local_track_uri(path)
    assert isinstance(result, compat.text_type)
    assert result == uri


@pytest.mark.parametrize('path,uri', [
    ('foo', 'local:directory:foo'),
    (b'foo', 'local:directory:foo'),
    ('æøå', 'local:directory:%C3%A6%C3%B8%C3%A5'),
    (b'\x00\x01\x02', 'local:directory:%00%01%02'),
])
def test_path_to_local_directory_uri(path, uri):
    result = translator.path_to_local_directory_uri(path)
    assert isinstance(result, compat.text_type)
    assert result == uri
