# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import unittest
import mozunit
from test_packager import MockFinder
from mozpack.packager import l10n
from mozpack.files import (
    GeneratedFile,
    ManifestFile,
)
from mozpack.chrome.manifest import (
    Manifest,
    ManifestLocale,
    ManifestContent,
)
from mozpack.copier import FileRegistry
from mozpack.packager.formats import FlatFormatter


class TestL10NRepack(unittest.TestCase):
    def test_l10n_repack(self):
        foo = GeneratedFile('foo')
        foobar = GeneratedFile('foobar')
        qux = GeneratedFile('qux')
        bar = GeneratedFile('bar')
        baz = GeneratedFile('baz')
        dict_aa = GeneratedFile('dict_aa')
        dict_bb = GeneratedFile('dict_bb')
        dict_cc = GeneratedFile('dict_cc')
        barbaz = GeneratedFile('barbaz')
        lst = GeneratedFile('foo\nbar')
        app_finder = MockFinder({
            'bar/foo': foo,
            'chrome/foo/foobar': foobar,
            'chrome/qux/qux.properties': qux,
            'chrome/qux/baz/baz.properties': baz,
            'chrome/chrome.manifest': ManifestFile('chrome', [
                ManifestContent('chrome', 'foo', 'foo/'),
                ManifestLocale('chrome', 'qux', 'en-US', 'qux/'),
            ]),
            'chrome.manifest':
            ManifestFile('', [Manifest('', 'chrome/chrome.manifest')]),
            'dict/aa': dict_aa,
            'app/chrome/bar/barbaz.dtd': barbaz,
            'app/chrome/chrome.manifest': ManifestFile('app/chrome', [
                ManifestLocale('app/chrome', 'bar', 'en-US', 'bar/')
            ]),
            'app/chrome.manifest':
            ManifestFile('app', [Manifest('app', 'chrome/chrome.manifest')]),
            'app/dict/bb': dict_bb,
            'app/dict/cc': dict_cc,
            'app/chrome/bar/search/foo.xml': foo,
            'app/chrome/bar/search/bar.xml': bar,
            'app/chrome/bar/search/lst.txt': lst,
        })
        app_finder.jarlogs = {}
        app_finder.base = 'app'
        foo_l10n = GeneratedFile('foo_l10n')
        qux_l10n = GeneratedFile('qux_l10n')
        baz_l10n = GeneratedFile('baz_l10n')
        barbaz_l10n = GeneratedFile('barbaz_l10n')
        lst_l10n = GeneratedFile('foo\nqux')
        l10n_finder = MockFinder({
            'chrome/qux-l10n/qux.properties': qux_l10n,
            'chrome/qux-l10n/baz/baz.properties': baz_l10n,
            'chrome/chrome.manifest': ManifestFile('chrome', [
                ManifestLocale('chrome', 'qux', 'x-test', 'qux-l10n/'),
            ]),
            'chrome.manifest':
            ManifestFile('', [Manifest('', 'chrome/chrome.manifest')]),
            'dict/bb': dict_bb,
            'dict/cc': dict_cc,
            'app/chrome/bar-l10n/barbaz.dtd': barbaz_l10n,
            'app/chrome/chrome.manifest': ManifestFile('app/chrome', [
                ManifestLocale('app/chrome', 'bar', 'x-test', 'bar-l10n/')
            ]),
            'app/chrome.manifest':
            ManifestFile('app', [Manifest('app', 'chrome/chrome.manifest')]),
            'app/dict/aa': dict_aa,
            'app/chrome/bar-l10n/search/foo.xml': foo_l10n,
            'app/chrome/bar-l10n/search/qux.xml': qux_l10n,
            'app/chrome/bar-l10n/search/lst.txt': lst_l10n,
        })
        l10n_finder.base = 'l10n'
        copier = FileRegistry()
        formatter = FlatFormatter(copier)

        l10n._repack(app_finder, l10n_finder, copier, formatter,
                     ['dict', 'chrome/**/search/*.xml'])
        self.maxDiff = None

        repacked = {
            'bar/foo': foo,
            'chrome/foo/foobar': foobar,
            'chrome/qux-l10n/qux.properties': qux_l10n,
            'chrome/qux-l10n/baz/baz.properties': baz_l10n,
            'chrome/chrome.manifest': ManifestFile('chrome', [
                ManifestContent('chrome', 'foo', 'foo/'),
                ManifestLocale('chrome', 'qux', 'x-test', 'qux-l10n/'),
            ]),
            'chrome.manifest':
            ManifestFile('', [Manifest('', 'chrome/chrome.manifest')]),
            'dict/bb': dict_bb,
            'dict/cc': dict_cc,
            'app/chrome/bar-l10n/barbaz.dtd': barbaz_l10n,
            'app/chrome/chrome.manifest': ManifestFile('app/chrome', [
                ManifestLocale('app/chrome', 'bar', 'x-test', 'bar-l10n/')
            ]),
            'app/chrome.manifest':
            ManifestFile('app', [Manifest('app', 'chrome/chrome.manifest')]),
            'app/dict/aa': dict_aa,
            'app/chrome/bar-l10n/search/foo.xml': foo_l10n,
            'app/chrome/bar-l10n/search/qux.xml': qux_l10n,
            'app/chrome/bar-l10n/search/lst.txt': lst_l10n,
        }

        self.assertEqual(
            dict((p, f.open().read()) for p, f in copier),
            dict((p, f.open().read()) for p, f in repacked.iteritems())
        )


if __name__ == '__main__':
    mozunit.main()
