##############################################################################
# Copyright (c) 2018 Parker Berberian, Sawyer Bergeron, and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
from django.test import TestCase
from django.contrib.auth.models import User
from account.models import Lab
from resource_inventory.models import *


class ConfigUtil():
    count=0

    @staticmethod
    def makeScenario():
        return Scenario.objects.create(name="testScenario")

    @staticmethod
    def makeInstaller():
        inst = Installer.objects.create(
            name = "testInstaller"
        )
        inst.sup_scenarios = [ConfigUtil.makeScenario()]
        return inst

    @staticmethod
    def makeOpsys():
        os = Opsys.objects.create(
            name = "test Operating System"
        )
        os.sup_installers = [ConfigUtil.makeInstaller()]
        return os

    @staticmethod
    def makeConfigBundle():
        user = User.objects.create(username="test_user" + str(ConfigUtil.count))
        ConfigUtil.count += 1
        return ConfigBundle.objects.create(
            owner = user
        )

    @staticmethod
    def makeOPNFVConfig():
        installer = ConfigUtil.makeInstaller()
        scenario = ConfigUtil.makeScenario()
        bundle = ConfigUtil.makeConfigBundle()
        return OPNFVConfig.objects.create(
                installer=installer,
                scenario=scenario,
                bundle=bundle
                )

    @staticmethod
    def makeOPNFVRole():
        return OPNFVRole.objects.create(
                name="Test role",
                description="This is a test role"
                )

    @staticmethod
    def makeImage():
        owner = User.objects.create(username="another test user")
        lab_user = User.objects.create(username="labUserForTests")
        lab = Lab.objects.create(
                lab_user=lab_user,
                name="this is lab for testing",
                contact_email="email@mail.com",
                contact_phone="123-4567"
                )

        return Image.objects.create(
                lab_id=0,
                from_lab=lab,
                name="an image for testing",
                owner=owner
                )


    @staticmethod
    def makeGenericHost():
        profile = HostProfile.objects.create(
                host_type=0,
                name="test lab for config bundle",
                description="this is a test profile"
                )
        user = User.objects.create(username="test sample user 12")
        bundle = GenericResourceBundle.objects.create(
                name="Generic bundle for config tests",
                xml="",
                owner=user,
                description=""
                )

        resource = GenericResource.objects.create(
                bundle=bundle,
                name="a test generic resource"
                )

        return GenericHost.objects.create(
                profile=profile,
                resource=resource
                )

    @staticmethod
    def makeHostConfiguration():
        host = ConfigUtil.makeGenericHost()
        image = ConfigUtil.makeImage()
        bundle = ConfigUtil.makeConfigBundle()
        opnfvRole = ConfigUtil.makeOPNFVRole()
        return HostConfiguration.objects.create(
                host=host,
                image=image,
                bundle=bundle,
                opnfvRole=opnfvRole
                )


class ScenarioTestCase(TestCase):

    def test_save(self):
        self.assertTrue(ConfigUtil.makeScenario())

class InstallerTestCase(TestCase):

    def test_save(self):
        self.assertTrue(ConfigUtil.makeInstaller())

class OperatingSystemTestCase(TestCase):

    def test_save(self):
        self.assertTrue(ConfigUtil.makeOpsys())

class ConfigBundleTestCase(TestCase):

    def test_save(self):
        self.assertTrue(ConfigUtil.makeConfigBundle())

class OPNFVConfigTestCase(TestCase):

    def test_save(self):
        self.assertTrue(ConfigUtil.makeOPNFVConfig())

class OPNFVRoleTestCase(TestCase):

    def test_save(self):
        self.assertTrue(ConfigUtil.makeOPNFVRole())


class HostConfigurationTestCase(TestCase):

    def test_save(self):
        self.assertTrue(ConfigUtil.makeHostConfiguration())


class ImageTestCase(TestCase):

    def test_save(self):
        self.assertTrue(ConfigUtil.makeImage())