# Copyright (C) 2019, Sam Thursfield (sam@afuera.me.uk)
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA  02110-1301, USA.

"""
Tests the FLAC+cuesheet extraction feature.
"""


import pathlib
import shutil
import tempfile
import unittest as ut

import configuration as cfg
import datagenerator
import fixtures


class FlacCuesheetTest(fixtures.TrackerExtractTestCase):
    def spec(self, audio_path):
        audio_uri = audio_path.as_uri()
        return {
            "@type" : [
                "nmm:MusicPiece",
                "nfo:Audio"
            ],
            "nmm:trackNumber" : 2,
            "nfo:audioOffset" : 257.69333333333333,
            "nmm:performer" : {
                "@id" : "urn:artist:My%20Bloody%20Valentine"
            },
            "nie:isStoredAs" : {
                "@id" : audio_uri,
                "@type" : [
                    "nfo:Audio",
                    "nmm:MusicPiece",
                    "nfo:Audio"
                ],
                "nmm:trackNumber" : 1,
                "nfo:audioOffset" : 0.0,
                "nmm:performer" : {
                    "@id" : "urn:artist:My%20Bloody%20Valentine",
                    "nmm:artistName" : "My Bloody Valentine",
                    "@type" : "nmm:Artist"
                },
                "nfo:channels" : 1,
                "nie:interpretedAs" : [
                    {
                        "@id" : audio_uri
                    },
                    {
                    }
                ],
                "nie:isStoredAs" : {
                    "@id" : audio_uri
                },
                "nfo:sampleRate" : 44100,
                "nie:title" : "Only Shallow",
                "nmm:musicAlbum" : {
                    "@id" : "urn:album:Loveless:My%20Bloody%20Valentine:1991-01-01"
                },
                "nmm:musicAlbumDisc" : {
                    "@id" : "urn:album-disc:Loveless:My%20Bloody%20Valentine:1991-01-01:Disc1"
                },
                "nfo:duration" : 360
            },
            "nie:title" : "Loomer",
            "nfo:duration" : 102,
            "nmm:musicAlbum" : {
                "@id" : "urn:album:Loveless:My%20Bloody%20Valentine:1991-01-01",
                "nie:title" : "Loveless",
                "nmm:albumTrackCount" : 2,
                "@type" : "nmm:MusicAlbum",
                "nmm:albumArtist" : {
                    "@id" : "urn:artist:My%20Bloody%20Valentine"
                }
            },
            "nmm:musicAlbumDisc" : {
                "@id" : "urn:album-disc:Loveless:My%20Bloody%20Valentine:1991-01-01:Disc1",
                "nmm:setNumber" : 1,
                "nmm:albumDiscAlbum" : {
                    "@id" : "urn:album:Loveless:My%20Bloody%20Valentine:1991-01-01"
                },
                "@type" : "nmm:MusicAlbumDisc"
            }
        }

    def test_external_cue_sheet(self):
        with tempfile.TemporaryDirectory() as tmpdir:
            datadir = pathlib.Path(__file__).parent.joinpath('test-extraction-data')
            shutil.copy(datadir.joinpath('audio', 'cuesheet-test.cue'), tmpdir)

            audio_path = pathlib.Path(tmpdir).joinpath('cuesheet-test.flac')
            datagenerator.create_test_flac(audio_path, duration=6*60)

            result = fixtures.get_tracker_extract_output(
                cfg.test_environment(tmpdir), audio_path, output_format='json-ld')
            file_data = result['@graph'][0]

        self.assert_extract_result_matches_spec(
            self.spec(audio_path), file_data, audio_path, __file__)


if __name__ == '__main__':
    fixtures.tracker_test_main()
