// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.

package provider

import (
	tfTypes "github.com/airbytehq/terraform-provider-airbyte/internal/provider/types"
	"github.com/airbytehq/terraform-provider-airbyte/internal/sdk/models/shared"
	"github.com/hashicorp/terraform-plugin-framework/types"
)

func (r *DestinationDatabricksResourceModel) ToSharedDestinationDatabricksCreateRequest() *shared.DestinationDatabricksCreateRequest {
	var name string
	name = r.Name.ValueString()

	definitionID := new(string)
	if !r.DefinitionID.IsUnknown() && !r.DefinitionID.IsNull() {
		*definitionID = r.DefinitionID.ValueString()
	} else {
		definitionID = nil
	}
	var workspaceID string
	workspaceID = r.WorkspaceID.ValueString()

	acceptTerms := new(bool)
	if !r.Configuration.AcceptTerms.IsUnknown() && !r.Configuration.AcceptTerms.IsNull() {
		*acceptTerms = r.Configuration.AcceptTerms.ValueBool()
	} else {
		acceptTerms = nil
	}
	var authentication shared.DestinationDatabricksAuthentication
	var oAuth2Recommended *shared.OAuth2Recommended
	if r.Configuration.Authentication.OAuth2Recommended != nil {
		var clientID string
		clientID = r.Configuration.Authentication.OAuth2Recommended.ClientID.ValueString()

		var secret string
		secret = r.Configuration.Authentication.OAuth2Recommended.Secret.ValueString()

		oAuth2Recommended = &shared.OAuth2Recommended{
			ClientID: clientID,
			Secret:   secret,
		}
	}
	if oAuth2Recommended != nil {
		authentication = shared.DestinationDatabricksAuthentication{
			OAuth2Recommended: oAuth2Recommended,
		}
	}
	var destinationDatabricksPersonalAccessToken *shared.DestinationDatabricksPersonalAccessToken
	if r.Configuration.Authentication.PersonalAccessToken != nil {
		var personalAccessToken string
		personalAccessToken = r.Configuration.Authentication.PersonalAccessToken.PersonalAccessToken.ValueString()

		destinationDatabricksPersonalAccessToken = &shared.DestinationDatabricksPersonalAccessToken{
			PersonalAccessToken: personalAccessToken,
		}
	}
	if destinationDatabricksPersonalAccessToken != nil {
		authentication = shared.DestinationDatabricksAuthentication{
			DestinationDatabricksPersonalAccessToken: destinationDatabricksPersonalAccessToken,
		}
	}
	var database string
	database = r.Configuration.Database.ValueString()

	var hostname string
	hostname = r.Configuration.Hostname.ValueString()

	var httpPath string
	httpPath = r.Configuration.HTTPPath.ValueString()

	port := new(string)
	if !r.Configuration.Port.IsUnknown() && !r.Configuration.Port.IsNull() {
		*port = r.Configuration.Port.ValueString()
	} else {
		port = nil
	}
	purgeStagingData := new(bool)
	if !r.Configuration.PurgeStagingData.IsUnknown() && !r.Configuration.PurgeStagingData.IsNull() {
		*purgeStagingData = r.Configuration.PurgeStagingData.ValueBool()
	} else {
		purgeStagingData = nil
	}
	rawSchemaOverride := new(string)
	if !r.Configuration.RawSchemaOverride.IsUnknown() && !r.Configuration.RawSchemaOverride.IsNull() {
		*rawSchemaOverride = r.Configuration.RawSchemaOverride.ValueString()
	} else {
		rawSchemaOverride = nil
	}
	schema := new(string)
	if !r.Configuration.Schema.IsUnknown() && !r.Configuration.Schema.IsNull() {
		*schema = r.Configuration.Schema.ValueString()
	} else {
		schema = nil
	}
	configuration := shared.DestinationDatabricks{
		AcceptTerms:       acceptTerms,
		Authentication:    authentication,
		Database:          database,
		Hostname:          hostname,
		HTTPPath:          httpPath,
		Port:              port,
		PurgeStagingData:  purgeStagingData,
		RawSchemaOverride: rawSchemaOverride,
		Schema:            schema,
	}
	out := shared.DestinationDatabricksCreateRequest{
		Name:          name,
		DefinitionID:  definitionID,
		WorkspaceID:   workspaceID,
		Configuration: configuration,
	}
	return &out
}

func (r *DestinationDatabricksResourceModel) RefreshFromSharedDestinationResponse(resp *shared.DestinationResponse) {
	if resp != nil {
		r.CreatedAt = types.Int64Value(resp.CreatedAt)
		r.DefinitionID = types.StringValue(resp.DefinitionID)
		r.DestinationID = types.StringValue(resp.DestinationID)
		r.DestinationType = types.StringValue(resp.DestinationType)
		r.Name = types.StringValue(resp.Name)
		if resp.ResourceAllocation == nil {
			r.ResourceAllocation = nil
		} else {
			r.ResourceAllocation = &tfTypes.ScopedResourceRequirements{}
			if resp.ResourceAllocation.Default == nil {
				r.ResourceAllocation.Default = nil
			} else {
				r.ResourceAllocation.Default = &tfTypes.ResourceRequirements{}
				r.ResourceAllocation.Default.CPULimit = types.StringPointerValue(resp.ResourceAllocation.Default.CPULimit)
				r.ResourceAllocation.Default.CPURequest = types.StringPointerValue(resp.ResourceAllocation.Default.CPURequest)
				r.ResourceAllocation.Default.EphemeralStorageLimit = types.StringPointerValue(resp.ResourceAllocation.Default.EphemeralStorageLimit)
				r.ResourceAllocation.Default.EphemeralStorageRequest = types.StringPointerValue(resp.ResourceAllocation.Default.EphemeralStorageRequest)
				r.ResourceAllocation.Default.MemoryLimit = types.StringPointerValue(resp.ResourceAllocation.Default.MemoryLimit)
				r.ResourceAllocation.Default.MemoryRequest = types.StringPointerValue(resp.ResourceAllocation.Default.MemoryRequest)
			}
			r.ResourceAllocation.JobSpecific = []tfTypes.JobTypeResourceLimit{}
			if len(r.ResourceAllocation.JobSpecific) > len(resp.ResourceAllocation.JobSpecific) {
				r.ResourceAllocation.JobSpecific = r.ResourceAllocation.JobSpecific[:len(resp.ResourceAllocation.JobSpecific)]
			}
			for jobSpecificCount, jobSpecificItem := range resp.ResourceAllocation.JobSpecific {
				var jobSpecific1 tfTypes.JobTypeResourceLimit
				jobSpecific1.JobType = types.StringValue(string(jobSpecificItem.JobType))
				jobSpecific1.ResourceRequirements.CPULimit = types.StringPointerValue(jobSpecificItem.ResourceRequirements.CPULimit)
				jobSpecific1.ResourceRequirements.CPURequest = types.StringPointerValue(jobSpecificItem.ResourceRequirements.CPURequest)
				jobSpecific1.ResourceRequirements.EphemeralStorageLimit = types.StringPointerValue(jobSpecificItem.ResourceRequirements.EphemeralStorageLimit)
				jobSpecific1.ResourceRequirements.EphemeralStorageRequest = types.StringPointerValue(jobSpecificItem.ResourceRequirements.EphemeralStorageRequest)
				jobSpecific1.ResourceRequirements.MemoryLimit = types.StringPointerValue(jobSpecificItem.ResourceRequirements.MemoryLimit)
				jobSpecific1.ResourceRequirements.MemoryRequest = types.StringPointerValue(jobSpecificItem.ResourceRequirements.MemoryRequest)
				if jobSpecificCount+1 > len(r.ResourceAllocation.JobSpecific) {
					r.ResourceAllocation.JobSpecific = append(r.ResourceAllocation.JobSpecific, jobSpecific1)
				} else {
					r.ResourceAllocation.JobSpecific[jobSpecificCount].JobType = jobSpecific1.JobType
					r.ResourceAllocation.JobSpecific[jobSpecificCount].ResourceRequirements = jobSpecific1.ResourceRequirements
				}
			}
		}
		r.WorkspaceID = types.StringValue(resp.WorkspaceID)
	}
}

func (r *DestinationDatabricksResourceModel) ToSharedDestinationDatabricksPutRequest() *shared.DestinationDatabricksPutRequest {
	var name string
	name = r.Name.ValueString()

	var workspaceID string
	workspaceID = r.WorkspaceID.ValueString()

	acceptTerms := new(bool)
	if !r.Configuration.AcceptTerms.IsUnknown() && !r.Configuration.AcceptTerms.IsNull() {
		*acceptTerms = r.Configuration.AcceptTerms.ValueBool()
	} else {
		acceptTerms = nil
	}
	var authentication shared.DestinationDatabricksUpdateAuthentication
	var destinationDatabricksUpdateOAuth2Recommended *shared.DestinationDatabricksUpdateOAuth2Recommended
	if r.Configuration.Authentication.OAuth2Recommended != nil {
		var clientID string
		clientID = r.Configuration.Authentication.OAuth2Recommended.ClientID.ValueString()

		var secret string
		secret = r.Configuration.Authentication.OAuth2Recommended.Secret.ValueString()

		destinationDatabricksUpdateOAuth2Recommended = &shared.DestinationDatabricksUpdateOAuth2Recommended{
			ClientID: clientID,
			Secret:   secret,
		}
	}
	if destinationDatabricksUpdateOAuth2Recommended != nil {
		authentication = shared.DestinationDatabricksUpdateAuthentication{
			DestinationDatabricksUpdateOAuth2Recommended: destinationDatabricksUpdateOAuth2Recommended,
		}
	}
	var destinationDatabricksUpdatePersonalAccessToken *shared.DestinationDatabricksUpdatePersonalAccessToken
	if r.Configuration.Authentication.PersonalAccessToken != nil {
		var personalAccessToken string
		personalAccessToken = r.Configuration.Authentication.PersonalAccessToken.PersonalAccessToken.ValueString()

		destinationDatabricksUpdatePersonalAccessToken = &shared.DestinationDatabricksUpdatePersonalAccessToken{
			PersonalAccessToken: personalAccessToken,
		}
	}
	if destinationDatabricksUpdatePersonalAccessToken != nil {
		authentication = shared.DestinationDatabricksUpdateAuthentication{
			DestinationDatabricksUpdatePersonalAccessToken: destinationDatabricksUpdatePersonalAccessToken,
		}
	}
	var database string
	database = r.Configuration.Database.ValueString()

	var hostname string
	hostname = r.Configuration.Hostname.ValueString()

	var httpPath string
	httpPath = r.Configuration.HTTPPath.ValueString()

	port := new(string)
	if !r.Configuration.Port.IsUnknown() && !r.Configuration.Port.IsNull() {
		*port = r.Configuration.Port.ValueString()
	} else {
		port = nil
	}
	purgeStagingData := new(bool)
	if !r.Configuration.PurgeStagingData.IsUnknown() && !r.Configuration.PurgeStagingData.IsNull() {
		*purgeStagingData = r.Configuration.PurgeStagingData.ValueBool()
	} else {
		purgeStagingData = nil
	}
	rawSchemaOverride := new(string)
	if !r.Configuration.RawSchemaOverride.IsUnknown() && !r.Configuration.RawSchemaOverride.IsNull() {
		*rawSchemaOverride = r.Configuration.RawSchemaOverride.ValueString()
	} else {
		rawSchemaOverride = nil
	}
	schema := new(string)
	if !r.Configuration.Schema.IsUnknown() && !r.Configuration.Schema.IsNull() {
		*schema = r.Configuration.Schema.ValueString()
	} else {
		schema = nil
	}
	configuration := shared.DestinationDatabricksUpdate{
		AcceptTerms:       acceptTerms,
		Authentication:    authentication,
		Database:          database,
		Hostname:          hostname,
		HTTPPath:          httpPath,
		Port:              port,
		PurgeStagingData:  purgeStagingData,
		RawSchemaOverride: rawSchemaOverride,
		Schema:            schema,
	}
	out := shared.DestinationDatabricksPutRequest{
		Name:          name,
		WorkspaceID:   workspaceID,
		Configuration: configuration,
	}
	return &out
}
