// generated from terraform resource schema
import * as cdktf from 'cdktf';
export function elasticsearchDomainAdvancedSecurityOptionsMasterUserOptionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        master_user_arn: cdktf.stringToTerraform(struct.masterUserArn),
        master_user_name: cdktf.stringToTerraform(struct.masterUserName),
        master_user_password: cdktf.stringToTerraform(struct.masterUserPassword),
    };
}
export class ElasticsearchDomainAdvancedSecurityOptionsMasterUserOptionsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._masterUserArn !== undefined) {
            hasAnyValues = true;
            internalValueResult.masterUserArn = this._masterUserArn;
        }
        if (this._masterUserName !== undefined) {
            hasAnyValues = true;
            internalValueResult.masterUserName = this._masterUserName;
        }
        if (this._masterUserPassword !== undefined) {
            hasAnyValues = true;
            internalValueResult.masterUserPassword = this._masterUserPassword;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._masterUserArn = undefined;
            this._masterUserName = undefined;
            this._masterUserPassword = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._masterUserArn = value.masterUserArn;
            this._masterUserName = value.masterUserName;
            this._masterUserPassword = value.masterUserPassword;
        }
    }
    // master_user_arn - computed: false, optional: true, required: false
    _masterUserArn;
    get masterUserArn() {
        return this.getStringAttribute('master_user_arn');
    }
    set masterUserArn(value) {
        this._masterUserArn = value;
    }
    resetMasterUserArn() {
        this._masterUserArn = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get masterUserArnInput() {
        return this._masterUserArn;
    }
    // master_user_name - computed: false, optional: true, required: false
    _masterUserName;
    get masterUserName() {
        return this.getStringAttribute('master_user_name');
    }
    set masterUserName(value) {
        this._masterUserName = value;
    }
    resetMasterUserName() {
        this._masterUserName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get masterUserNameInput() {
        return this._masterUserName;
    }
    // master_user_password - computed: false, optional: true, required: false
    _masterUserPassword;
    get masterUserPassword() {
        return this.getStringAttribute('master_user_password');
    }
    set masterUserPassword(value) {
        this._masterUserPassword = value;
    }
    resetMasterUserPassword() {
        this._masterUserPassword = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get masterUserPasswordInput() {
        return this._masterUserPassword;
    }
}
export function elasticsearchDomainAdvancedSecurityOptionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        enabled: cdktf.booleanToTerraform(struct.enabled),
        internal_user_database_enabled: cdktf.booleanToTerraform(struct.internalUserDatabaseEnabled),
        master_user_options: elasticsearchDomainAdvancedSecurityOptionsMasterUserOptionsToTerraform(struct.masterUserOptions),
    };
}
export class ElasticsearchDomainAdvancedSecurityOptionsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._enabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.enabled = this._enabled;
        }
        if (this._internalUserDatabaseEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.internalUserDatabaseEnabled = this._internalUserDatabaseEnabled;
        }
        if (this._masterUserOptions?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.masterUserOptions = this._masterUserOptions?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._enabled = undefined;
            this._internalUserDatabaseEnabled = undefined;
            this._masterUserOptions.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._enabled = value.enabled;
            this._internalUserDatabaseEnabled = value.internalUserDatabaseEnabled;
            this._masterUserOptions.internalValue = value.masterUserOptions;
        }
    }
    // enabled - computed: false, optional: false, required: true
    _enabled;
    get enabled() {
        return this.getBooleanAttribute('enabled');
    }
    set enabled(value) {
        this._enabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get enabledInput() {
        return this._enabled;
    }
    // internal_user_database_enabled - computed: false, optional: true, required: false
    _internalUserDatabaseEnabled;
    get internalUserDatabaseEnabled() {
        return this.getBooleanAttribute('internal_user_database_enabled');
    }
    set internalUserDatabaseEnabled(value) {
        this._internalUserDatabaseEnabled = value;
    }
    resetInternalUserDatabaseEnabled() {
        this._internalUserDatabaseEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get internalUserDatabaseEnabledInput() {
        return this._internalUserDatabaseEnabled;
    }
    // master_user_options - computed: false, optional: true, required: false
    _masterUserOptions = new ElasticsearchDomainAdvancedSecurityOptionsMasterUserOptionsOutputReference(this, "master_user_options", true);
    get masterUserOptions() {
        return this._masterUserOptions;
    }
    putMasterUserOptions(value) {
        this._masterUserOptions.internalValue = value;
    }
    resetMasterUserOptions() {
        this._masterUserOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get masterUserOptionsInput() {
        return this._masterUserOptions.internalValue;
    }
}
export function elasticsearchDomainAutoTuneOptionsMaintenanceScheduleDurationToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        unit: cdktf.stringToTerraform(struct.unit),
        value: cdktf.numberToTerraform(struct.value),
    };
}
export class ElasticsearchDomainAutoTuneOptionsMaintenanceScheduleDurationOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._unit !== undefined) {
            hasAnyValues = true;
            internalValueResult.unit = this._unit;
        }
        if (this._value !== undefined) {
            hasAnyValues = true;
            internalValueResult.value = this._value;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._unit = undefined;
            this._value = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._unit = value.unit;
            this._value = value.value;
        }
    }
    // unit - computed: false, optional: false, required: true
    _unit;
    get unit() {
        return this.getStringAttribute('unit');
    }
    set unit(value) {
        this._unit = value;
    }
    // Temporarily expose input value. Use with caution.
    get unitInput() {
        return this._unit;
    }
    // value - computed: false, optional: false, required: true
    _value;
    get value() {
        return this.getNumberAttribute('value');
    }
    set value(value) {
        this._value = value;
    }
    // Temporarily expose input value. Use with caution.
    get valueInput() {
        return this._value;
    }
}
export function elasticsearchDomainAutoTuneOptionsMaintenanceScheduleToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        cron_expression_for_recurrence: cdktf.stringToTerraform(struct.cronExpressionForRecurrence),
        start_at: cdktf.stringToTerraform(struct.startAt),
        duration: elasticsearchDomainAutoTuneOptionsMaintenanceScheduleDurationToTerraform(struct.duration),
    };
}
export function elasticsearchDomainAutoTuneOptionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        desired_state: cdktf.stringToTerraform(struct.desiredState),
        rollback_on_disable: cdktf.stringToTerraform(struct.rollbackOnDisable),
        maintenance_schedule: cdktf.listMapper(elasticsearchDomainAutoTuneOptionsMaintenanceScheduleToTerraform)(struct.maintenanceSchedule),
    };
}
export class ElasticsearchDomainAutoTuneOptionsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._desiredState !== undefined) {
            hasAnyValues = true;
            internalValueResult.desiredState = this._desiredState;
        }
        if (this._rollbackOnDisable !== undefined) {
            hasAnyValues = true;
            internalValueResult.rollbackOnDisable = this._rollbackOnDisable;
        }
        if (this._maintenanceSchedule !== undefined) {
            hasAnyValues = true;
            internalValueResult.maintenanceSchedule = this._maintenanceSchedule;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._desiredState = undefined;
            this._rollbackOnDisable = undefined;
            this._maintenanceSchedule = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._desiredState = value.desiredState;
            this._rollbackOnDisable = value.rollbackOnDisable;
            this._maintenanceSchedule = value.maintenanceSchedule;
        }
    }
    // desired_state - computed: false, optional: false, required: true
    _desiredState;
    get desiredState() {
        return this.getStringAttribute('desired_state');
    }
    set desiredState(value) {
        this._desiredState = value;
    }
    // Temporarily expose input value. Use with caution.
    get desiredStateInput() {
        return this._desiredState;
    }
    // rollback_on_disable - computed: true, optional: true, required: false
    _rollbackOnDisable;
    get rollbackOnDisable() {
        return this.getStringAttribute('rollback_on_disable');
    }
    set rollbackOnDisable(value) {
        this._rollbackOnDisable = value;
    }
    resetRollbackOnDisable() {
        this._rollbackOnDisable = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get rollbackOnDisableInput() {
        return this._rollbackOnDisable;
    }
    // maintenance_schedule - computed: false, optional: true, required: false
    _maintenanceSchedule;
    get maintenanceSchedule() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('maintenance_schedule')));
    }
    set maintenanceSchedule(value) {
        this._maintenanceSchedule = value;
    }
    resetMaintenanceSchedule() {
        this._maintenanceSchedule = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get maintenanceScheduleInput() {
        return this._maintenanceSchedule;
    }
}
export function elasticsearchDomainClusterConfigZoneAwarenessConfigToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        availability_zone_count: cdktf.numberToTerraform(struct.availabilityZoneCount),
    };
}
export class ElasticsearchDomainClusterConfigZoneAwarenessConfigOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._availabilityZoneCount !== undefined) {
            hasAnyValues = true;
            internalValueResult.availabilityZoneCount = this._availabilityZoneCount;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._availabilityZoneCount = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._availabilityZoneCount = value.availabilityZoneCount;
        }
    }
    // availability_zone_count - computed: false, optional: true, required: false
    _availabilityZoneCount;
    get availabilityZoneCount() {
        return this.getNumberAttribute('availability_zone_count');
    }
    set availabilityZoneCount(value) {
        this._availabilityZoneCount = value;
    }
    resetAvailabilityZoneCount() {
        this._availabilityZoneCount = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get availabilityZoneCountInput() {
        return this._availabilityZoneCount;
    }
}
export function elasticsearchDomainClusterConfigToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        dedicated_master_count: cdktf.numberToTerraform(struct.dedicatedMasterCount),
        dedicated_master_enabled: cdktf.booleanToTerraform(struct.dedicatedMasterEnabled),
        dedicated_master_type: cdktf.stringToTerraform(struct.dedicatedMasterType),
        instance_count: cdktf.numberToTerraform(struct.instanceCount),
        instance_type: cdktf.stringToTerraform(struct.instanceType),
        warm_count: cdktf.numberToTerraform(struct.warmCount),
        warm_enabled: cdktf.booleanToTerraform(struct.warmEnabled),
        warm_type: cdktf.stringToTerraform(struct.warmType),
        zone_awareness_enabled: cdktf.booleanToTerraform(struct.zoneAwarenessEnabled),
        zone_awareness_config: elasticsearchDomainClusterConfigZoneAwarenessConfigToTerraform(struct.zoneAwarenessConfig),
    };
}
export class ElasticsearchDomainClusterConfigOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._dedicatedMasterCount !== undefined) {
            hasAnyValues = true;
            internalValueResult.dedicatedMasterCount = this._dedicatedMasterCount;
        }
        if (this._dedicatedMasterEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.dedicatedMasterEnabled = this._dedicatedMasterEnabled;
        }
        if (this._dedicatedMasterType !== undefined) {
            hasAnyValues = true;
            internalValueResult.dedicatedMasterType = this._dedicatedMasterType;
        }
        if (this._instanceCount !== undefined) {
            hasAnyValues = true;
            internalValueResult.instanceCount = this._instanceCount;
        }
        if (this._instanceType !== undefined) {
            hasAnyValues = true;
            internalValueResult.instanceType = this._instanceType;
        }
        if (this._warmCount !== undefined) {
            hasAnyValues = true;
            internalValueResult.warmCount = this._warmCount;
        }
        if (this._warmEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.warmEnabled = this._warmEnabled;
        }
        if (this._warmType !== undefined) {
            hasAnyValues = true;
            internalValueResult.warmType = this._warmType;
        }
        if (this._zoneAwarenessEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.zoneAwarenessEnabled = this._zoneAwarenessEnabled;
        }
        if (this._zoneAwarenessConfig?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.zoneAwarenessConfig = this._zoneAwarenessConfig?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._dedicatedMasterCount = undefined;
            this._dedicatedMasterEnabled = undefined;
            this._dedicatedMasterType = undefined;
            this._instanceCount = undefined;
            this._instanceType = undefined;
            this._warmCount = undefined;
            this._warmEnabled = undefined;
            this._warmType = undefined;
            this._zoneAwarenessEnabled = undefined;
            this._zoneAwarenessConfig.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._dedicatedMasterCount = value.dedicatedMasterCount;
            this._dedicatedMasterEnabled = value.dedicatedMasterEnabled;
            this._dedicatedMasterType = value.dedicatedMasterType;
            this._instanceCount = value.instanceCount;
            this._instanceType = value.instanceType;
            this._warmCount = value.warmCount;
            this._warmEnabled = value.warmEnabled;
            this._warmType = value.warmType;
            this._zoneAwarenessEnabled = value.zoneAwarenessEnabled;
            this._zoneAwarenessConfig.internalValue = value.zoneAwarenessConfig;
        }
    }
    // dedicated_master_count - computed: false, optional: true, required: false
    _dedicatedMasterCount;
    get dedicatedMasterCount() {
        return this.getNumberAttribute('dedicated_master_count');
    }
    set dedicatedMasterCount(value) {
        this._dedicatedMasterCount = value;
    }
    resetDedicatedMasterCount() {
        this._dedicatedMasterCount = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get dedicatedMasterCountInput() {
        return this._dedicatedMasterCount;
    }
    // dedicated_master_enabled - computed: false, optional: true, required: false
    _dedicatedMasterEnabled;
    get dedicatedMasterEnabled() {
        return this.getBooleanAttribute('dedicated_master_enabled');
    }
    set dedicatedMasterEnabled(value) {
        this._dedicatedMasterEnabled = value;
    }
    resetDedicatedMasterEnabled() {
        this._dedicatedMasterEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get dedicatedMasterEnabledInput() {
        return this._dedicatedMasterEnabled;
    }
    // dedicated_master_type - computed: false, optional: true, required: false
    _dedicatedMasterType;
    get dedicatedMasterType() {
        return this.getStringAttribute('dedicated_master_type');
    }
    set dedicatedMasterType(value) {
        this._dedicatedMasterType = value;
    }
    resetDedicatedMasterType() {
        this._dedicatedMasterType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get dedicatedMasterTypeInput() {
        return this._dedicatedMasterType;
    }
    // instance_count - computed: false, optional: true, required: false
    _instanceCount;
    get instanceCount() {
        return this.getNumberAttribute('instance_count');
    }
    set instanceCount(value) {
        this._instanceCount = value;
    }
    resetInstanceCount() {
        this._instanceCount = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get instanceCountInput() {
        return this._instanceCount;
    }
    // instance_type - computed: false, optional: true, required: false
    _instanceType;
    get instanceType() {
        return this.getStringAttribute('instance_type');
    }
    set instanceType(value) {
        this._instanceType = value;
    }
    resetInstanceType() {
        this._instanceType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get instanceTypeInput() {
        return this._instanceType;
    }
    // warm_count - computed: false, optional: true, required: false
    _warmCount;
    get warmCount() {
        return this.getNumberAttribute('warm_count');
    }
    set warmCount(value) {
        this._warmCount = value;
    }
    resetWarmCount() {
        this._warmCount = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get warmCountInput() {
        return this._warmCount;
    }
    // warm_enabled - computed: false, optional: true, required: false
    _warmEnabled;
    get warmEnabled() {
        return this.getBooleanAttribute('warm_enabled');
    }
    set warmEnabled(value) {
        this._warmEnabled = value;
    }
    resetWarmEnabled() {
        this._warmEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get warmEnabledInput() {
        return this._warmEnabled;
    }
    // warm_type - computed: false, optional: true, required: false
    _warmType;
    get warmType() {
        return this.getStringAttribute('warm_type');
    }
    set warmType(value) {
        this._warmType = value;
    }
    resetWarmType() {
        this._warmType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get warmTypeInput() {
        return this._warmType;
    }
    // zone_awareness_enabled - computed: false, optional: true, required: false
    _zoneAwarenessEnabled;
    get zoneAwarenessEnabled() {
        return this.getBooleanAttribute('zone_awareness_enabled');
    }
    set zoneAwarenessEnabled(value) {
        this._zoneAwarenessEnabled = value;
    }
    resetZoneAwarenessEnabled() {
        this._zoneAwarenessEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get zoneAwarenessEnabledInput() {
        return this._zoneAwarenessEnabled;
    }
    // zone_awareness_config - computed: false, optional: true, required: false
    _zoneAwarenessConfig = new ElasticsearchDomainClusterConfigZoneAwarenessConfigOutputReference(this, "zone_awareness_config", true);
    get zoneAwarenessConfig() {
        return this._zoneAwarenessConfig;
    }
    putZoneAwarenessConfig(value) {
        this._zoneAwarenessConfig.internalValue = value;
    }
    resetZoneAwarenessConfig() {
        this._zoneAwarenessConfig.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get zoneAwarenessConfigInput() {
        return this._zoneAwarenessConfig.internalValue;
    }
}
export function elasticsearchDomainCognitoOptionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        enabled: cdktf.booleanToTerraform(struct.enabled),
        identity_pool_id: cdktf.stringToTerraform(struct.identityPoolId),
        role_arn: cdktf.stringToTerraform(struct.roleArn),
        user_pool_id: cdktf.stringToTerraform(struct.userPoolId),
    };
}
export class ElasticsearchDomainCognitoOptionsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._enabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.enabled = this._enabled;
        }
        if (this._identityPoolId !== undefined) {
            hasAnyValues = true;
            internalValueResult.identityPoolId = this._identityPoolId;
        }
        if (this._roleArn !== undefined) {
            hasAnyValues = true;
            internalValueResult.roleArn = this._roleArn;
        }
        if (this._userPoolId !== undefined) {
            hasAnyValues = true;
            internalValueResult.userPoolId = this._userPoolId;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._enabled = undefined;
            this._identityPoolId = undefined;
            this._roleArn = undefined;
            this._userPoolId = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._enabled = value.enabled;
            this._identityPoolId = value.identityPoolId;
            this._roleArn = value.roleArn;
            this._userPoolId = value.userPoolId;
        }
    }
    // enabled - computed: false, optional: true, required: false
    _enabled;
    get enabled() {
        return this.getBooleanAttribute('enabled');
    }
    set enabled(value) {
        this._enabled = value;
    }
    resetEnabled() {
        this._enabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get enabledInput() {
        return this._enabled;
    }
    // identity_pool_id - computed: false, optional: false, required: true
    _identityPoolId;
    get identityPoolId() {
        return this.getStringAttribute('identity_pool_id');
    }
    set identityPoolId(value) {
        this._identityPoolId = value;
    }
    // Temporarily expose input value. Use with caution.
    get identityPoolIdInput() {
        return this._identityPoolId;
    }
    // role_arn - computed: false, optional: false, required: true
    _roleArn;
    get roleArn() {
        return this.getStringAttribute('role_arn');
    }
    set roleArn(value) {
        this._roleArn = value;
    }
    // Temporarily expose input value. Use with caution.
    get roleArnInput() {
        return this._roleArn;
    }
    // user_pool_id - computed: false, optional: false, required: true
    _userPoolId;
    get userPoolId() {
        return this.getStringAttribute('user_pool_id');
    }
    set userPoolId(value) {
        this._userPoolId = value;
    }
    // Temporarily expose input value. Use with caution.
    get userPoolIdInput() {
        return this._userPoolId;
    }
}
export function elasticsearchDomainDomainEndpointOptionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        custom_endpoint: cdktf.stringToTerraform(struct.customEndpoint),
        custom_endpoint_certificate_arn: cdktf.stringToTerraform(struct.customEndpointCertificateArn),
        custom_endpoint_enabled: cdktf.booleanToTerraform(struct.customEndpointEnabled),
        enforce_https: cdktf.booleanToTerraform(struct.enforceHttps),
        tls_security_policy: cdktf.stringToTerraform(struct.tlsSecurityPolicy),
    };
}
export class ElasticsearchDomainDomainEndpointOptionsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._customEndpoint !== undefined) {
            hasAnyValues = true;
            internalValueResult.customEndpoint = this._customEndpoint;
        }
        if (this._customEndpointCertificateArn !== undefined) {
            hasAnyValues = true;
            internalValueResult.customEndpointCertificateArn = this._customEndpointCertificateArn;
        }
        if (this._customEndpointEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.customEndpointEnabled = this._customEndpointEnabled;
        }
        if (this._enforceHttps !== undefined) {
            hasAnyValues = true;
            internalValueResult.enforceHttps = this._enforceHttps;
        }
        if (this._tlsSecurityPolicy !== undefined) {
            hasAnyValues = true;
            internalValueResult.tlsSecurityPolicy = this._tlsSecurityPolicy;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._customEndpoint = undefined;
            this._customEndpointCertificateArn = undefined;
            this._customEndpointEnabled = undefined;
            this._enforceHttps = undefined;
            this._tlsSecurityPolicy = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._customEndpoint = value.customEndpoint;
            this._customEndpointCertificateArn = value.customEndpointCertificateArn;
            this._customEndpointEnabled = value.customEndpointEnabled;
            this._enforceHttps = value.enforceHttps;
            this._tlsSecurityPolicy = value.tlsSecurityPolicy;
        }
    }
    // custom_endpoint - computed: false, optional: true, required: false
    _customEndpoint;
    get customEndpoint() {
        return this.getStringAttribute('custom_endpoint');
    }
    set customEndpoint(value) {
        this._customEndpoint = value;
    }
    resetCustomEndpoint() {
        this._customEndpoint = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get customEndpointInput() {
        return this._customEndpoint;
    }
    // custom_endpoint_certificate_arn - computed: false, optional: true, required: false
    _customEndpointCertificateArn;
    get customEndpointCertificateArn() {
        return this.getStringAttribute('custom_endpoint_certificate_arn');
    }
    set customEndpointCertificateArn(value) {
        this._customEndpointCertificateArn = value;
    }
    resetCustomEndpointCertificateArn() {
        this._customEndpointCertificateArn = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get customEndpointCertificateArnInput() {
        return this._customEndpointCertificateArn;
    }
    // custom_endpoint_enabled - computed: false, optional: true, required: false
    _customEndpointEnabled;
    get customEndpointEnabled() {
        return this.getBooleanAttribute('custom_endpoint_enabled');
    }
    set customEndpointEnabled(value) {
        this._customEndpointEnabled = value;
    }
    resetCustomEndpointEnabled() {
        this._customEndpointEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get customEndpointEnabledInput() {
        return this._customEndpointEnabled;
    }
    // enforce_https - computed: false, optional: true, required: false
    _enforceHttps;
    get enforceHttps() {
        return this.getBooleanAttribute('enforce_https');
    }
    set enforceHttps(value) {
        this._enforceHttps = value;
    }
    resetEnforceHttps() {
        this._enforceHttps = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get enforceHttpsInput() {
        return this._enforceHttps;
    }
    // tls_security_policy - computed: true, optional: true, required: false
    _tlsSecurityPolicy;
    get tlsSecurityPolicy() {
        return this.getStringAttribute('tls_security_policy');
    }
    set tlsSecurityPolicy(value) {
        this._tlsSecurityPolicy = value;
    }
    resetTlsSecurityPolicy() {
        this._tlsSecurityPolicy = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tlsSecurityPolicyInput() {
        return this._tlsSecurityPolicy;
    }
}
export function elasticsearchDomainEbsOptionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        ebs_enabled: cdktf.booleanToTerraform(struct.ebsEnabled),
        iops: cdktf.numberToTerraform(struct.iops),
        volume_size: cdktf.numberToTerraform(struct.volumeSize),
        volume_type: cdktf.stringToTerraform(struct.volumeType),
    };
}
export class ElasticsearchDomainEbsOptionsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._ebsEnabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.ebsEnabled = this._ebsEnabled;
        }
        if (this._iops !== undefined) {
            hasAnyValues = true;
            internalValueResult.iops = this._iops;
        }
        if (this._volumeSize !== undefined) {
            hasAnyValues = true;
            internalValueResult.volumeSize = this._volumeSize;
        }
        if (this._volumeType !== undefined) {
            hasAnyValues = true;
            internalValueResult.volumeType = this._volumeType;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._ebsEnabled = undefined;
            this._iops = undefined;
            this._volumeSize = undefined;
            this._volumeType = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._ebsEnabled = value.ebsEnabled;
            this._iops = value.iops;
            this._volumeSize = value.volumeSize;
            this._volumeType = value.volumeType;
        }
    }
    // ebs_enabled - computed: false, optional: false, required: true
    _ebsEnabled;
    get ebsEnabled() {
        return this.getBooleanAttribute('ebs_enabled');
    }
    set ebsEnabled(value) {
        this._ebsEnabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get ebsEnabledInput() {
        return this._ebsEnabled;
    }
    // iops - computed: false, optional: true, required: false
    _iops;
    get iops() {
        return this.getNumberAttribute('iops');
    }
    set iops(value) {
        this._iops = value;
    }
    resetIops() {
        this._iops = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get iopsInput() {
        return this._iops;
    }
    // volume_size - computed: false, optional: true, required: false
    _volumeSize;
    get volumeSize() {
        return this.getNumberAttribute('volume_size');
    }
    set volumeSize(value) {
        this._volumeSize = value;
    }
    resetVolumeSize() {
        this._volumeSize = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get volumeSizeInput() {
        return this._volumeSize;
    }
    // volume_type - computed: true, optional: true, required: false
    _volumeType;
    get volumeType() {
        return this.getStringAttribute('volume_type');
    }
    set volumeType(value) {
        this._volumeType = value;
    }
    resetVolumeType() {
        this._volumeType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get volumeTypeInput() {
        return this._volumeType;
    }
}
export function elasticsearchDomainEncryptAtRestToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        enabled: cdktf.booleanToTerraform(struct.enabled),
        kms_key_id: cdktf.stringToTerraform(struct.kmsKeyId),
    };
}
export class ElasticsearchDomainEncryptAtRestOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._enabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.enabled = this._enabled;
        }
        if (this._kmsKeyId !== undefined) {
            hasAnyValues = true;
            internalValueResult.kmsKeyId = this._kmsKeyId;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._enabled = undefined;
            this._kmsKeyId = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._enabled = value.enabled;
            this._kmsKeyId = value.kmsKeyId;
        }
    }
    // enabled - computed: false, optional: false, required: true
    _enabled;
    get enabled() {
        return this.getBooleanAttribute('enabled');
    }
    set enabled(value) {
        this._enabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get enabledInput() {
        return this._enabled;
    }
    // kms_key_id - computed: true, optional: true, required: false
    _kmsKeyId;
    get kmsKeyId() {
        return this.getStringAttribute('kms_key_id');
    }
    set kmsKeyId(value) {
        this._kmsKeyId = value;
    }
    resetKmsKeyId() {
        this._kmsKeyId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get kmsKeyIdInput() {
        return this._kmsKeyId;
    }
}
export function elasticsearchDomainLogPublishingOptionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        cloudwatch_log_group_arn: cdktf.stringToTerraform(struct.cloudwatchLogGroupArn),
        enabled: cdktf.booleanToTerraform(struct.enabled),
        log_type: cdktf.stringToTerraform(struct.logType),
    };
}
export function elasticsearchDomainNodeToNodeEncryptionToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        enabled: cdktf.booleanToTerraform(struct.enabled),
    };
}
export class ElasticsearchDomainNodeToNodeEncryptionOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._enabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.enabled = this._enabled;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._enabled = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._enabled = value.enabled;
        }
    }
    // enabled - computed: false, optional: false, required: true
    _enabled;
    get enabled() {
        return this.getBooleanAttribute('enabled');
    }
    set enabled(value) {
        this._enabled = value;
    }
    // Temporarily expose input value. Use with caution.
    get enabledInput() {
        return this._enabled;
    }
}
export function elasticsearchDomainSnapshotOptionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        automated_snapshot_start_hour: cdktf.numberToTerraform(struct.automatedSnapshotStartHour),
    };
}
export class ElasticsearchDomainSnapshotOptionsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._automatedSnapshotStartHour !== undefined) {
            hasAnyValues = true;
            internalValueResult.automatedSnapshotStartHour = this._automatedSnapshotStartHour;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._automatedSnapshotStartHour = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._automatedSnapshotStartHour = value.automatedSnapshotStartHour;
        }
    }
    // automated_snapshot_start_hour - computed: false, optional: false, required: true
    _automatedSnapshotStartHour;
    get automatedSnapshotStartHour() {
        return this.getNumberAttribute('automated_snapshot_start_hour');
    }
    set automatedSnapshotStartHour(value) {
        this._automatedSnapshotStartHour = value;
    }
    // Temporarily expose input value. Use with caution.
    get automatedSnapshotStartHourInput() {
        return this._automatedSnapshotStartHour;
    }
}
export function elasticsearchDomainTimeoutsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        update: cdktf.stringToTerraform(struct.update),
    };
}
export class ElasticsearchDomainTimeoutsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._update !== undefined) {
            hasAnyValues = true;
            internalValueResult.update = this._update;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._update = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._update = value.update;
        }
    }
    // update - computed: false, optional: true, required: false
    _update;
    get update() {
        return this.getStringAttribute('update');
    }
    set update(value) {
        this._update = value;
    }
    resetUpdate() {
        this._update = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get updateInput() {
        return this._update;
    }
}
export function elasticsearchDomainVpcOptionsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        security_group_ids: cdktf.listMapper(cdktf.stringToTerraform)(struct.securityGroupIds),
        subnet_ids: cdktf.listMapper(cdktf.stringToTerraform)(struct.subnetIds),
    };
}
export class ElasticsearchDomainVpcOptionsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._securityGroupIds !== undefined) {
            hasAnyValues = true;
            internalValueResult.securityGroupIds = this._securityGroupIds;
        }
        if (this._subnetIds !== undefined) {
            hasAnyValues = true;
            internalValueResult.subnetIds = this._subnetIds;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._securityGroupIds = undefined;
            this._subnetIds = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._securityGroupIds = value.securityGroupIds;
            this._subnetIds = value.subnetIds;
        }
    }
    // availability_zones - computed: true, optional: false, required: false
    get availabilityZones() {
        return cdktf.Fn.tolist(this.getListAttribute('availability_zones'));
    }
    // security_group_ids - computed: false, optional: true, required: false
    _securityGroupIds;
    get securityGroupIds() {
        return cdktf.Fn.tolist(this.getListAttribute('security_group_ids'));
    }
    set securityGroupIds(value) {
        this._securityGroupIds = value;
    }
    resetSecurityGroupIds() {
        this._securityGroupIds = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get securityGroupIdsInput() {
        return this._securityGroupIds;
    }
    // subnet_ids - computed: false, optional: true, required: false
    _subnetIds;
    get subnetIds() {
        return cdktf.Fn.tolist(this.getListAttribute('subnet_ids'));
    }
    set subnetIds(value) {
        this._subnetIds = value;
    }
    resetSubnetIds() {
        this._subnetIds = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get subnetIdsInput() {
        return this._subnetIds;
    }
    // vpc_id - computed: true, optional: false, required: false
    get vpcId() {
        return this.getStringAttribute('vpc_id');
    }
}
/**
* Represents a {@link https://www.terraform.io/docs/providers/aws/r/elasticsearch_domain aws_elasticsearch_domain}
*/
export class ElasticsearchDomain extends cdktf.TerraformResource {
    // =================
    // STATIC PROPERTIES
    // =================
    static tfResourceType = "aws_elasticsearch_domain";
    // ===========
    // INITIALIZER
    // ===========
    /**
    * Create a new {@link https://www.terraform.io/docs/providers/aws/r/elasticsearch_domain aws_elasticsearch_domain} Resource
    *
    * @param scope The scope in which to define this construct
    * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
    * @param options ElasticsearchDomainConfig
    */
    constructor(scope, id, config) {
        super(scope, id, {
            terraformResourceType: 'aws_elasticsearch_domain',
            terraformGeneratorMetadata: {
                providerName: 'aws'
            },
            provider: config.provider,
            dependsOn: config.dependsOn,
            count: config.count,
            lifecycle: config.lifecycle
        });
        this._accessPolicies = config.accessPolicies;
        this._advancedOptions = config.advancedOptions;
        this._domainName = config.domainName;
        this._elasticsearchVersion = config.elasticsearchVersion;
        this._tags = config.tags;
        this._tagsAll = config.tagsAll;
        this._advancedSecurityOptions.internalValue = config.advancedSecurityOptions;
        this._autoTuneOptions.internalValue = config.autoTuneOptions;
        this._clusterConfig.internalValue = config.clusterConfig;
        this._cognitoOptions.internalValue = config.cognitoOptions;
        this._domainEndpointOptions.internalValue = config.domainEndpointOptions;
        this._ebsOptions.internalValue = config.ebsOptions;
        this._encryptAtRest.internalValue = config.encryptAtRest;
        this._logPublishingOptions = config.logPublishingOptions;
        this._nodeToNodeEncryption.internalValue = config.nodeToNodeEncryption;
        this._snapshotOptions.internalValue = config.snapshotOptions;
        this._timeouts.internalValue = config.timeouts;
        this._vpcOptions.internalValue = config.vpcOptions;
    }
    // ==========
    // ATTRIBUTES
    // ==========
    // access_policies - computed: true, optional: true, required: false
    _accessPolicies;
    get accessPolicies() {
        return this.getStringAttribute('access_policies');
    }
    set accessPolicies(value) {
        this._accessPolicies = value;
    }
    resetAccessPolicies() {
        this._accessPolicies = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get accessPoliciesInput() {
        return this._accessPolicies;
    }
    // advanced_options - computed: true, optional: true, required: false
    _advancedOptions;
    get advancedOptions() {
        return this.getStringMapAttribute('advanced_options');
    }
    set advancedOptions(value) {
        this._advancedOptions = value;
    }
    resetAdvancedOptions() {
        this._advancedOptions = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get advancedOptionsInput() {
        return this._advancedOptions;
    }
    // arn - computed: true, optional: false, required: false
    get arn() {
        return this.getStringAttribute('arn');
    }
    // domain_id - computed: true, optional: false, required: false
    get domainId() {
        return this.getStringAttribute('domain_id');
    }
    // domain_name - computed: false, optional: false, required: true
    _domainName;
    get domainName() {
        return this.getStringAttribute('domain_name');
    }
    set domainName(value) {
        this._domainName = value;
    }
    // Temporarily expose input value. Use with caution.
    get domainNameInput() {
        return this._domainName;
    }
    // elasticsearch_version - computed: false, optional: true, required: false
    _elasticsearchVersion;
    get elasticsearchVersion() {
        return this.getStringAttribute('elasticsearch_version');
    }
    set elasticsearchVersion(value) {
        this._elasticsearchVersion = value;
    }
    resetElasticsearchVersion() {
        this._elasticsearchVersion = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get elasticsearchVersionInput() {
        return this._elasticsearchVersion;
    }
    // endpoint - computed: true, optional: false, required: false
    get endpoint() {
        return this.getStringAttribute('endpoint');
    }
    // id - computed: true, optional: true, required: false
    get id() {
        return this.getStringAttribute('id');
    }
    // kibana_endpoint - computed: true, optional: false, required: false
    get kibanaEndpoint() {
        return this.getStringAttribute('kibana_endpoint');
    }
    // tags - computed: false, optional: true, required: false
    _tags;
    get tags() {
        return this.getStringMapAttribute('tags');
    }
    set tags(value) {
        this._tags = value;
    }
    resetTags() {
        this._tags = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tagsInput() {
        return this._tags;
    }
    // tags_all - computed: true, optional: true, required: false
    _tagsAll;
    get tagsAll() {
        return this.getStringMapAttribute('tags_all');
    }
    set tagsAll(value) {
        this._tagsAll = value;
    }
    resetTagsAll() {
        this._tagsAll = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tagsAllInput() {
        return this._tagsAll;
    }
    // advanced_security_options - computed: false, optional: true, required: false
    _advancedSecurityOptions = new ElasticsearchDomainAdvancedSecurityOptionsOutputReference(this, "advanced_security_options", true);
    get advancedSecurityOptions() {
        return this._advancedSecurityOptions;
    }
    putAdvancedSecurityOptions(value) {
        this._advancedSecurityOptions.internalValue = value;
    }
    resetAdvancedSecurityOptions() {
        this._advancedSecurityOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get advancedSecurityOptionsInput() {
        return this._advancedSecurityOptions.internalValue;
    }
    // auto_tune_options - computed: false, optional: true, required: false
    _autoTuneOptions = new ElasticsearchDomainAutoTuneOptionsOutputReference(this, "auto_tune_options", true);
    get autoTuneOptions() {
        return this._autoTuneOptions;
    }
    putAutoTuneOptions(value) {
        this._autoTuneOptions.internalValue = value;
    }
    resetAutoTuneOptions() {
        this._autoTuneOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get autoTuneOptionsInput() {
        return this._autoTuneOptions.internalValue;
    }
    // cluster_config - computed: false, optional: true, required: false
    _clusterConfig = new ElasticsearchDomainClusterConfigOutputReference(this, "cluster_config", true);
    get clusterConfig() {
        return this._clusterConfig;
    }
    putClusterConfig(value) {
        this._clusterConfig.internalValue = value;
    }
    resetClusterConfig() {
        this._clusterConfig.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get clusterConfigInput() {
        return this._clusterConfig.internalValue;
    }
    // cognito_options - computed: false, optional: true, required: false
    _cognitoOptions = new ElasticsearchDomainCognitoOptionsOutputReference(this, "cognito_options", true);
    get cognitoOptions() {
        return this._cognitoOptions;
    }
    putCognitoOptions(value) {
        this._cognitoOptions.internalValue = value;
    }
    resetCognitoOptions() {
        this._cognitoOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get cognitoOptionsInput() {
        return this._cognitoOptions.internalValue;
    }
    // domain_endpoint_options - computed: false, optional: true, required: false
    _domainEndpointOptions = new ElasticsearchDomainDomainEndpointOptionsOutputReference(this, "domain_endpoint_options", true);
    get domainEndpointOptions() {
        return this._domainEndpointOptions;
    }
    putDomainEndpointOptions(value) {
        this._domainEndpointOptions.internalValue = value;
    }
    resetDomainEndpointOptions() {
        this._domainEndpointOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get domainEndpointOptionsInput() {
        return this._domainEndpointOptions.internalValue;
    }
    // ebs_options - computed: false, optional: true, required: false
    _ebsOptions = new ElasticsearchDomainEbsOptionsOutputReference(this, "ebs_options", true);
    get ebsOptions() {
        return this._ebsOptions;
    }
    putEbsOptions(value) {
        this._ebsOptions.internalValue = value;
    }
    resetEbsOptions() {
        this._ebsOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get ebsOptionsInput() {
        return this._ebsOptions.internalValue;
    }
    // encrypt_at_rest - computed: false, optional: true, required: false
    _encryptAtRest = new ElasticsearchDomainEncryptAtRestOutputReference(this, "encrypt_at_rest", true);
    get encryptAtRest() {
        return this._encryptAtRest;
    }
    putEncryptAtRest(value) {
        this._encryptAtRest.internalValue = value;
    }
    resetEncryptAtRest() {
        this._encryptAtRest.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get encryptAtRestInput() {
        return this._encryptAtRest.internalValue;
    }
    // log_publishing_options - computed: false, optional: true, required: false
    _logPublishingOptions;
    get logPublishingOptions() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('log_publishing_options')));
    }
    set logPublishingOptions(value) {
        this._logPublishingOptions = value;
    }
    resetLogPublishingOptions() {
        this._logPublishingOptions = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get logPublishingOptionsInput() {
        return this._logPublishingOptions;
    }
    // node_to_node_encryption - computed: false, optional: true, required: false
    _nodeToNodeEncryption = new ElasticsearchDomainNodeToNodeEncryptionOutputReference(this, "node_to_node_encryption", true);
    get nodeToNodeEncryption() {
        return this._nodeToNodeEncryption;
    }
    putNodeToNodeEncryption(value) {
        this._nodeToNodeEncryption.internalValue = value;
    }
    resetNodeToNodeEncryption() {
        this._nodeToNodeEncryption.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get nodeToNodeEncryptionInput() {
        return this._nodeToNodeEncryption.internalValue;
    }
    // snapshot_options - computed: false, optional: true, required: false
    _snapshotOptions = new ElasticsearchDomainSnapshotOptionsOutputReference(this, "snapshot_options", true);
    get snapshotOptions() {
        return this._snapshotOptions;
    }
    putSnapshotOptions(value) {
        this._snapshotOptions.internalValue = value;
    }
    resetSnapshotOptions() {
        this._snapshotOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get snapshotOptionsInput() {
        return this._snapshotOptions.internalValue;
    }
    // timeouts - computed: false, optional: true, required: false
    _timeouts = new ElasticsearchDomainTimeoutsOutputReference(this, "timeouts", true);
    get timeouts() {
        return this._timeouts;
    }
    putTimeouts(value) {
        this._timeouts.internalValue = value;
    }
    resetTimeouts() {
        this._timeouts.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get timeoutsInput() {
        return this._timeouts.internalValue;
    }
    // vpc_options - computed: false, optional: true, required: false
    _vpcOptions = new ElasticsearchDomainVpcOptionsOutputReference(this, "vpc_options", true);
    get vpcOptions() {
        return this._vpcOptions;
    }
    putVpcOptions(value) {
        this._vpcOptions.internalValue = value;
    }
    resetVpcOptions() {
        this._vpcOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get vpcOptionsInput() {
        return this._vpcOptions.internalValue;
    }
    // =========
    // SYNTHESIS
    // =========
    synthesizeAttributes() {
        return {
            access_policies: cdktf.stringToTerraform(this._accessPolicies),
            advanced_options: cdktf.hashMapper(cdktf.stringToTerraform)(this._advancedOptions),
            domain_name: cdktf.stringToTerraform(this._domainName),
            elasticsearch_version: cdktf.stringToTerraform(this._elasticsearchVersion),
            tags: cdktf.hashMapper(cdktf.stringToTerraform)(this._tags),
            tags_all: cdktf.hashMapper(cdktf.stringToTerraform)(this._tagsAll),
            advanced_security_options: elasticsearchDomainAdvancedSecurityOptionsToTerraform(this._advancedSecurityOptions.internalValue),
            auto_tune_options: elasticsearchDomainAutoTuneOptionsToTerraform(this._autoTuneOptions.internalValue),
            cluster_config: elasticsearchDomainClusterConfigToTerraform(this._clusterConfig.internalValue),
            cognito_options: elasticsearchDomainCognitoOptionsToTerraform(this._cognitoOptions.internalValue),
            domain_endpoint_options: elasticsearchDomainDomainEndpointOptionsToTerraform(this._domainEndpointOptions.internalValue),
            ebs_options: elasticsearchDomainEbsOptionsToTerraform(this._ebsOptions.internalValue),
            encrypt_at_rest: elasticsearchDomainEncryptAtRestToTerraform(this._encryptAtRest.internalValue),
            log_publishing_options: cdktf.listMapper(elasticsearchDomainLogPublishingOptionsToTerraform)(this._logPublishingOptions),
            node_to_node_encryption: elasticsearchDomainNodeToNodeEncryptionToTerraform(this._nodeToNodeEncryption.internalValue),
            snapshot_options: elasticsearchDomainSnapshotOptionsToTerraform(this._snapshotOptions.internalValue),
            timeouts: elasticsearchDomainTimeoutsToTerraform(this._timeouts.internalValue),
            vpc_options: elasticsearchDomainVpcOptionsToTerraform(this._vpcOptions.internalValue),
        };
    }
}
//# sourceMappingURL=elasticsearch-domain.js.map