"""
Copyright (c) Contributors to the Open 3D Engine Project.
For complete copyright and license terms please see the LICENSE at the root of this distribution.

SPDX-License-Identifier: Apache-2.0 OR MIT

Class for querying and setting a system setting/preference.

"""

import pytest
import logging
from typing import Optional, Any

import ly_test_tools.o3de.pipeline_utils as utils

logger = logging.getLogger(__name__)


class PlatformSetting:
    """
    Interface for managing different platforms' system variables.
    """

    class DATA_TYPE:
        """Platform-agnostic data type enums"""

        INT = 1
        STR = 2
        STR_LIST = 3

    def __init__(self, workspace: pytest.fixture, subkey: str, key: str) -> None:
        self._workspace = workspace
        self._key = key
        self._subkey = subkey

    def get_value(self, get_type: bool = False) -> object:
        """Gets the current setting's value (and optionally type as tuple) from the system. Returns None if entry DNE"""
        raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform")

    def set_value(self, value: any) -> bool:
        """Sets the current setting's value. Creates the entry if it DNE. Returns True for success."""
        raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform")

    def delete_entry(self) -> bool:
        """Deletes the settings entry. Returns boolean for success."""
        raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform")

    def entry_exists(self) -> bool:
        """Checks if the settings entry exists."""
        raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform")

    @staticmethod
    def get_system_setting(workspace: pytest.fixture, subkey: str, key: str, hive: Optional[str] = None) -> Any:
        """Factory method creates a platform-specific system setting accessor"""
        if workspace.asset_processor_platform == 'windows':
            # import WindowsSetting and return an instance
            from automatedtesting_shared.windows_registry_setting import WindowsRegistrySetting

            return WindowsRegistrySetting(workspace, subkey, key, hive)
        # ########################################################
        #       Insert Mac (and Linux?) Setting implementations
        # ########################################################
        else:
            raise NotImplementedError(f"Platform: {workspace.platform} not supported yet")
