#!/usr/bin/env python3

import inspect
import json
import logging
import os
import shutil
import sys
import tempfile
import unittest

localmodule = os.path.realpath(
    os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')
)
print('localmodule: ' + localmodule)
if localmodule not in sys.path:
    sys.path.insert(0, localmodule)

from fdroidserver import common, gpgsign
from pathlib import Path
from unittest.mock import MagicMock, patch


class GpgsignTest(unittest.TestCase):
    basedir = Path(__file__).resolve().parent

    def setUp(self):
        logging.basicConfig(level=logging.DEBUG)
        self.tempdir = tempfile.TemporaryDirectory()
        os.chdir(self.tempdir.name)
        self.repodir = Path('repo')
        self.repodir.mkdir()

        gpgsign.config = None
        config = common.read_config()
        config['verbose'] = True
        config['gpghome'] = str((self.basedir / 'gnupghome').resolve())
        config['gpgkey'] = '1DBA2E89'
        gpgsign.config = config

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

    @patch('sys.argv', ['fdroid gpgsign', '--verbose'])
    @patch('fdroidserver.gpgsign.FDroidPopen')
    def test_sign_index(self, FDroidPopen):
        """This skips running gpg because its hard to setup in a test env"""
        index_v1_json = 'repo/index-v1.json'
        shutil.copy(str(self.basedir / index_v1_json), 'repo')
        shutil.copy(str(self.basedir / 'SpeedoMeterApp.main_1.apk'), 'repo')

        def _side_effect(gpg):
            f = gpg[-1]
            sig = gpg[3]
            self.assertTrue(sig.startswith(f))
            open(sig, 'w').close()
            p = MagicMock()
            p.returncode = 0
            return p

        FDroidPopen.side_effect = _side_effect
        gpgsign.main()
        self.assertTrue(FDroidPopen.called)
        self.assertTrue((self.repodir / 'index-v1.json').exists())
        self.assertTrue((self.repodir / 'index-v1.json.asc').exists())
        self.assertTrue((self.repodir / 'SpeedoMeterApp.main_1.apk.asc').exists())
        self.assertFalse((self.repodir / 'index.jar.asc').exists())
        # smoke check status JSON
        with (self.repodir / 'status/gpgsign.json').open() as fp:
            data = json.load(fp)
        self.assertTrue('index-v1.json' in data['signed'])


if __name__ == "__main__":
    os.chdir(os.path.dirname(__file__))

    import argparse

    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-v",
        "--verbose",
        action="store_true",
        default=False,
        help="Spew out even more information than normal",
    )
    common.parse_args(parser)

    newSuite = unittest.TestSuite()
    newSuite.addTest(unittest.makeSuite(GpgsignTest))
    unittest.main(failfast=False)
