from flask_restful import fields

from core.app.segments import SecretVariable, SegmentType, Variable
from core.helper import encrypter
from fields.member_fields import simple_account_fields
from libs.helper import TimestampField

ENVIRONMENT_VARIABLE_SUPPORTED_TYPES = (SegmentType.STRING, SegmentType.NUMBER, SegmentType.SECRET)


class EnvironmentVariableField(fields.Raw):
    def format(self, value):
        # Mask secret variables values in environment_variables
        if isinstance(value, SecretVariable):
            return {
                'id': value.id,
                'name': value.name,
                'value': encrypter.obfuscated_token(value.value),
                'value_type': value.value_type.value,
            }
        if isinstance(value, Variable):
            return {
                'id': value.id,
                'name': value.name,
                'value': value.value,
                'value_type': value.value_type.value,
            }
        if isinstance(value, dict):
            value_type = value.get('value_type')
            if value_type not in ENVIRONMENT_VARIABLE_SUPPORTED_TYPES:
                raise ValueError(f'Unsupported environment variable value type: {value_type}')
            return value


environment_variable_fields = {
    'id': fields.String,
    'name': fields.String,
    'value': fields.Raw,
    'value_type': fields.String(attribute='value_type.value'),
}

workflow_fields = {
    'id': fields.String,
    'graph': fields.Raw(attribute='graph_dict'),
    'features': fields.Raw(attribute='features_dict'),
    'hash': fields.String(attribute='unique_hash'),
    'created_by': fields.Nested(simple_account_fields, attribute='created_by_account'),
    'created_at': TimestampField,
    'updated_by': fields.Nested(simple_account_fields, attribute='updated_by_account', allow_null=True),
    'updated_at': TimestampField,
    'tool_published': fields.Boolean,
    'environment_variables': fields.List(EnvironmentVariableField()),
}