# Copyright 2023 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
from dataclasses import dataclass
from typing import Self

from execution_params import ExecutionParams

SDK_TOOL_PATH_KEY = "FUCHSIA_SDK_TOOL_PATH"
TARGETS_KEY = "FUCHSIA_TARGETS"
OUTPUT_DIRECTORY_KEY = "FUCHSIA_TEST_OUTDIR"
EXECUTION_JSON_KEY = "FUCHSIA_EXECUTION_JSON"


@dataclass
class Params:
    """Class to parse and validate environment parameters."""

    sdk_tool_path: str
    target: str | None
    execution_params: ExecutionParams
    output_directory: str

    @classmethod
    def initialize(cls, env_vars: dict[str, str | None]) -> Self:
        """This function initializes this class using environment dictionary.

        Args:
            env_vars (dict): Dictionary containing required environment variables.

        Raises:
            ValueError: Validation error

        Returns:
            Self
        """
        sdk_tool_path = env_vars.get(SDK_TOOL_PATH_KEY)
        output_directory = env_vars.get(OUTPUT_DIRECTORY_KEY)
        execution_json = env_vars.get(EXECUTION_JSON_KEY)

        if sdk_tool_path is None:
            raise ValueError(
                f"'{SDK_TOOL_PATH_KEY}' environment variable is not available."
            )

        if output_directory is None:
            raise ValueError(
                f"'{OUTPUT_DIRECTORY_KEY}' environment variable is not available."
            )

        if not os.path.exists(sdk_tool_path):
            raise ValueError(
                f"'{SDK_TOOL_PATH_KEY}: {sdk_tool_path}' path does not exist."
            )

        if not os.path.exists(output_directory):
            raise ValueError(
                f"'{OUTPUT_DIRECTORY_KEY}: {output_directory}' path does not exist."
            )

        if execution_json is None:
            raise ValueError(
                f"'{EXECUTION_JSON_KEY}' environment variable is not available."
            )

        execution_params = ExecutionParams.initialize_from_json(execution_json)

        return cls(
            sdk_tool_path,
            env_vars.get(TARGETS_KEY, None),
            execution_params,
            output_directory,
        )
