# ---------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# ---------------------------------------------------------

# pylint: disable=unused-argument,no-self-use

from marshmallow import INCLUDE, Schema, fields, post_dump, post_load

from azure.ai.ml._schema.core.fields import ArmStr, StringTransformedEnum, UnionField
from azure.ai.ml._schema.pipeline.pipeline_component import NodeNameStr
from azure.ai.ml._utils.utils import is_private_preview_enabled
from azure.ai.ml.constants._common import AzureMLResourceType, SERVERLESS_COMPUTE


class PipelineJobSettingsSchema(Schema):
    class Meta:
        unknown = INCLUDE

    default_datastore = ArmStr(azureml_type=AzureMLResourceType.DATASTORE)
    default_compute = UnionField(
        [
            StringTransformedEnum(allowed_values=[SERVERLESS_COMPUTE]),
            ArmStr(azureml_type=AzureMLResourceType.COMPUTE),
        ]
    )
    continue_on_step_failure = fields.Bool()
    force_rerun = fields.Bool()

    # move init/finalize under private preview flag to hide them in spec
    if is_private_preview_enabled():
        on_init = NodeNameStr()
        on_finalize = NodeNameStr()

    @post_load
    def make(self, data, **kwargs) -> "PipelineJobSettings":
        from azure.ai.ml.entities import PipelineJobSettings

        return PipelineJobSettings(**data)

    @post_dump
    def remove_none(self, data, **kwargs):
        return {key: value for key, value in data.items() if value is not None}
