# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.urls import reverse

from InvenTree.api_tester import InvenTreeAPITestCase


class PluginDetailAPITest(InvenTreeAPITestCase):
    """
    Tests the plugin API endpoints
    """

    roles = [
        'admin.add',
        'admin.view',
        'admin.change',
        'admin.delete',
    ]

    def setUp(self):
        self.MSG_NO_PKG = 'Either packagename of URL must be provided'

        self.PKG_NAME = 'minimal'
        self.PKG_URL = 'git+https://github.com/geoffrey-a-reed/minimal'
        super().setUp()

    def test_plugin_install(self):
        """
        Test the plugin install command
        """
        url = reverse('api-plugin-install')

        # valid - Pypi
        data = self.post(url, {
            'confirm': True,
            'packagename': self.PKG_NAME
        }, expected_code=201).data
        self.assertEqual(data['success'], True)

        # valid - github url
        data = self.post(url, {
            'confirm': True,
            'url': self.PKG_URL
        }, expected_code=201).data
        self.assertEqual(data['success'], True)

        # invalid tries
        # no input
        self.post(url, {}, expected_code=400)

        # no package info
        data = self.post(url, {
            'confirm': True,
        }, expected_code=400).data
        self.assertEqual(data['url'][0].title().upper(), self.MSG_NO_PKG.upper())
        self.assertEqual(data['packagename'][0].title().upper(), self.MSG_NO_PKG.upper())

        # not confirmed
        self.post(url, {
            'packagename': self.PKG_NAME
        }, expected_code=400).data
        data = self.post(url, {
            'packagename': self.PKG_NAME,
            'confirm': False,
        }, expected_code=400).data
        self.assertEqual(data['confirm'][0].title().upper(), 'Installation not confirmed'.upper())

    def test_admin_action(self):
        """
        Test the PluginConfig action commands
        """
        from plugin.models import PluginConfig
        from plugin import registry

        url = reverse('admin:plugin_pluginconfig_changelist')
        fixtures = PluginConfig.objects.all()

        # check if plugins were registered -> in some test setups the startup has no db access
        print(f'[PLUGIN-TEST] currently {len(fixtures)} plugin entries found')
        if not fixtures:
            registry.reload_plugins()
            fixtures = PluginConfig.objects.all()
            print(f'Reloaded plugins - now {len(fixtures)} entries found')

        print([str(a) for a in fixtures])
        fixtures = fixtures[0:1]
        # deactivate plugin
        response = self.client.post(url, {
            'action': 'plugin_deactivate',
            'index': 0,
            '_selected_action': [f.pk for f in fixtures],
        }, follow=True)
        self.assertEqual(response.status_code, 200)

        # deactivate plugin - deactivate again -> nothing will hapen but the nothing 'changed' function is triggered
        response = self.client.post(url, {
            'action': 'plugin_deactivate',
            'index': 0,
            '_selected_action': [f.pk for f in fixtures],
        }, follow=True)
        self.assertEqual(response.status_code, 200)

        # activate plugin
        response = self.client.post(url, {
            'action': 'plugin_activate',
            'index': 0,
            '_selected_action': [f.pk for f in fixtures],
        }, follow=True)
        self.assertEqual(response.status_code, 200)

        # activate everything
        fixtures = PluginConfig.objects.all()
        response = self.client.post(url, {
            'action': 'plugin_activate',
            'index': 0,
            '_selected_action': [f.pk for f in fixtures],
        }, follow=True)
        self.assertEqual(response.status_code, 200)

        fixtures = PluginConfig.objects.filter(active=True)
        # save to deactivate a plugin
        response = self.client.post(reverse('admin:plugin_pluginconfig_change', args=(fixtures.first().pk, )), {
            '_save': 'Save',
        }, follow=True)
        self.assertEqual(response.status_code, 200)
