#!/usr/bin/python3

import glob
import os
import shutil
import subprocess
import tempfile
import unittest


class TestReplayGain(unittest.TestCase):
    def setUp(self):
        self.FILENAMES = [
            'message-new-instant.oga',
            'phone-incoming-call.oga',
            'phone-outgoing-busy.oga',
            'phone-outgoing-calling.oga',
        ]

        self.tempdir = tempfile.TemporaryDirectory()

        for f in self.FILENAMES:
            shutil.copy(
                os.path.join(os.path.dirname(__file__), f),
                os.path.join(self.tempdir.name, f),
            )

    def test_replaygain(self):
        subprocess.run(
            ['replaygain'] + list(self.FILENAMES),
            check=True,
            cwd=self.tempdir.name,
        )

        completed = subprocess.run(
            ['vorbiscomment', 'message-new-instant.oga'],
            stdout=subprocess.PIPE,
            check=True,
            cwd=self.tempdir.name,
            universal_newlines=True,
        )

        metadata = {}

        for line in completed.stdout.splitlines():
            print('vorbiscomment:', line)
            k, v = line.split('=', 1)
            metadata[k] = v

        self.assertIn('replaygain_reference_loudness', metadata)
        self.assertEqual(metadata['replaygain_reference_loudness'], '89 dB')

        self.assertIn('replaygain_track_gain', metadata)
        v = metadata['replaygain_track_gain']
        self.assertTrue(v.endswith(' dB'))
        self.assertAlmostEqual(float(v[:-3]), 7.70000000, delta=0.01)

        self.assertIn('replaygain_track_peak', metadata)
        v = metadata['replaygain_track_peak']
        self.assertAlmostEqual(float(v), 0.16903333, delta=0.001)

        self.assertIn('replaygain_album_gain', metadata)
        v = metadata['replaygain_album_gain']
        self.assertTrue(v.endswith(' dB'))
        self.assertAlmostEqual(float(v[:-3]), -8.58000000, delta=0.01)

        self.assertIn('replaygain_album_peak', metadata)
        v = metadata['replaygain_album_peak']
        self.assertAlmostEqual(float(v), 0.72679681, delta=0.001)

    def tearDown(self):
        self.tempdir.cleanup()

if __name__ == '__main__':
    unittest.main(verbosity=1)
