# SPDX-FileCopyrightText: 2017-2022 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later

# ############################################################
# Importing - Same For All Render Layer Tests
# ############################################################

import unittest

from view_layer_common import (
    ViewLayerTesting,
    setup_extra_arguments,
)


# ############################################################
# Testing
# ############################################################

class UnitTesting(ViewLayerTesting):
    def test_operator_context(self):
        """
        See if view layer context is properly set/get with operators overrides
        when we set view_layer in context, the collection should change as well
        """
        import bpy
        import os

        class SampleOperator(bpy.types.Operator):
            bl_idname = "testing.sample"
            bl_label = "Sample Operator"

            view_layer = bpy.props.StringProperty(
                default="Not Set",
                options={'SKIP_SAVE'},
            )

            scene_collection = bpy.props.StringProperty(
                default="",
                options={'SKIP_SAVE'},
            )

            use_verbose = bpy.props.BoolProperty(
                default=False,
                options={'SKIP_SAVE'},
            )

            def execute(self, context):
                view_layer = context.view_layer
                ret = {'FINISHED'}

                # this is simply playing safe
                if view_layer.name != self.view_layer:
                    if self.use_verbose:
                        print('ERROR: Render Layer mismatch: "{0}" != "{1}"'.format(
                            view_layer.name, self.view_layer))
                    ret = {'CANCELLED'}

                scene_collection_name = None
                if self.scene_collection:
                    scene_collection_name = self.scene_collection
                else:
                    scene_collection_name = view_layer.collections.active.name

                # while this is the real test
                if context.scene_collection.name != scene_collection_name:
                    if self.use_verbose:
                        print('ERROR: Scene Collection mismatch: "{0}" != "{1}"'.format(
                            context.scene_collection.name, scene_collection_name))
                    ret = {'CANCELLED'}
                return ret

        bpy.utils.register_class(SampleOperator)

        # open sample file
        ROOT = self.get_root()
        filepath_layers = os.path.join(ROOT, 'layers.blend')
        bpy.ops.wm.open_mainfile('EXEC_DEFAULT', filepath=filepath_layers)
        self.rename_collections()

        # change the file
        three_b = bpy.data.objects.get('T.3b')
        three_c = bpy.data.objects.get('T.3c')
        scene = bpy.context.scene
        subzero = scene.master_collection.collections['1'].collections.new('sub-zero')
        scorpion = subzero.collections.new('scorpion')
        subzero.objects.link(three_b)
        scorpion.objects.link(three_c)
        layer = scene.view_layers.new('Fresh new Layer')
        layer.collections.unlink(layer.collections.active)
        layer.collections.link(subzero)
        layer.collections.active_index = 3
        self.assertEqual(layer.collections.active.name, 'scorpion')

        # Change active scene layer (do it for window too just to don't get mangled in window bugs)
        scene = bpy.context.scene
        bpy.context.window.view_layer = bpy.context.scene.view_layers['Viewport']

        # old layer
        self.assertEqual(bpy.ops.testing.sample(view_layer='Viewport', use_verbose=True), {'FINISHED'})

        # expected to fail
        self.assertTrue(bpy.ops.testing.sample(view_layer=layer.name), {'CANCELLED'})

        # set view layer and scene collection
        override = bpy.context.copy()
        override["view_layer"] = layer
        override["scene_collection"] = subzero
        self.assertEqual(bpy.ops.testing.sample(
            override,
            view_layer=layer.name,
            scene_collection=subzero.name,  # 'sub-zero'
            use_verbose=True), {'FINISHED'})

        # set only view layer
        override = bpy.context.copy()
        override["view_layer"] = layer

        self.assertNotEqual(bpy.context.view_layer.name, layer.name)
        self.assertNotEqual(bpy.context.scene_collection.name, layer.collections.active.name)

        self.assertEqual(bpy.ops.testing.sample(
            override,
            view_layer=layer.name,
            scene_collection=layer.collections.active.name,  # 'scorpion'
            use_verbose=False), {'CANCELLED'})


# ############################################################
# Main - Same For All Render Layer Tests
# ############################################################

if __name__ == '__main__':
    UnitTesting._extra_arguments = setup_extra_arguments(__file__)
    unittest.main()
