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

package shared

import (
	"encoding/json"
	"errors"
	"fmt"
	"github.com/airbytehq/terraform-provider-airbyte/internal/sdk/internal/utils"
	"time"
)

type SourceJotformUpdateSchemasAPIEndpoint string

const (
	SourceJotformUpdateSchemasAPIEndpointEnterprise SourceJotformUpdateSchemasAPIEndpoint = "enterprise"
)

func (e SourceJotformUpdateSchemasAPIEndpoint) ToPointer() *SourceJotformUpdateSchemasAPIEndpoint {
	return &e
}
func (e *SourceJotformUpdateSchemasAPIEndpoint) UnmarshalJSON(data []byte) error {
	var v string
	if err := json.Unmarshal(data, &v); err != nil {
		return err
	}
	switch v {
	case "enterprise":
		*e = SourceJotformUpdateSchemasAPIEndpoint(v)
		return nil
	default:
		return fmt.Errorf("invalid value for SourceJotformUpdateSchemasAPIEndpoint: %v", v)
	}
}

type SourceJotformUpdateEnterprise struct {
	apiEndpoint *SourceJotformUpdateSchemasAPIEndpoint `const:"enterprise" json:"api_endpoint,omitempty"`
	// Upgrade to Enterprise to make your API url your-domain.com/API or subdomain.jotform.com/API instead of api.jotform.com
	EnterpriseURL string `json:"enterprise_url"`
}

func (s SourceJotformUpdateEnterprise) MarshalJSON() ([]byte, error) {
	return utils.MarshalJSON(s, "", false)
}

func (s *SourceJotformUpdateEnterprise) UnmarshalJSON(data []byte) error {
	if err := utils.UnmarshalJSON(data, &s, "", false, true); err != nil {
		return err
	}
	return nil
}

func (o *SourceJotformUpdateEnterprise) GetAPIEndpoint() *SourceJotformUpdateSchemasAPIEndpoint {
	return SourceJotformUpdateSchemasAPIEndpointEnterprise.ToPointer()
}

func (o *SourceJotformUpdateEnterprise) GetEnterpriseURL() string {
	if o == nil {
		return ""
	}
	return o.EnterpriseURL
}

type SourceJotformUpdateSchemasAPIEndpointAPIEndpoint string

const (
	SourceJotformUpdateSchemasAPIEndpointAPIEndpointBasic SourceJotformUpdateSchemasAPIEndpointAPIEndpoint = "basic"
)

func (e SourceJotformUpdateSchemasAPIEndpointAPIEndpoint) ToPointer() *SourceJotformUpdateSchemasAPIEndpointAPIEndpoint {
	return &e
}
func (e *SourceJotformUpdateSchemasAPIEndpointAPIEndpoint) UnmarshalJSON(data []byte) error {
	var v string
	if err := json.Unmarshal(data, &v); err != nil {
		return err
	}
	switch v {
	case "basic":
		*e = SourceJotformUpdateSchemasAPIEndpointAPIEndpoint(v)
		return nil
	default:
		return fmt.Errorf("invalid value for SourceJotformUpdateSchemasAPIEndpointAPIEndpoint: %v", v)
	}
}

// SourceJotformUpdateBaseURLPrefix - You can access our API through the following URLs - Standard API Usage (Use the default API URL - https://api.jotform.com), For EU (Use the EU API URL - https://eu-api.jotform.com), For HIPAA (Use the HIPAA API URL - https://hipaa-api.jotform.com)
type SourceJotformUpdateBaseURLPrefix string

const (
	SourceJotformUpdateBaseURLPrefixStandard SourceJotformUpdateBaseURLPrefix = "Standard"
	SourceJotformUpdateBaseURLPrefixEu       SourceJotformUpdateBaseURLPrefix = "EU"
	SourceJotformUpdateBaseURLPrefixHipaa    SourceJotformUpdateBaseURLPrefix = "HIPAA"
)

func (e SourceJotformUpdateBaseURLPrefix) ToPointer() *SourceJotformUpdateBaseURLPrefix {
	return &e
}
func (e *SourceJotformUpdateBaseURLPrefix) UnmarshalJSON(data []byte) error {
	var v string
	if err := json.Unmarshal(data, &v); err != nil {
		return err
	}
	switch v {
	case "Standard":
		fallthrough
	case "EU":
		fallthrough
	case "HIPAA":
		*e = SourceJotformUpdateBaseURLPrefix(v)
		return nil
	default:
		return fmt.Errorf("invalid value for SourceJotformUpdateBaseURLPrefix: %v", v)
	}
}

type SourceJotformUpdateBasic struct {
	apiEndpoint *SourceJotformUpdateSchemasAPIEndpointAPIEndpoint `const:"basic" json:"api_endpoint,omitempty"`
	// You can access our API through the following URLs - Standard API Usage (Use the default API URL - https://api.jotform.com), For EU (Use the EU API URL - https://eu-api.jotform.com), For HIPAA (Use the HIPAA API URL - https://hipaa-api.jotform.com)
	URLPrefix *SourceJotformUpdateBaseURLPrefix `default:"Standard" json:"url_prefix"`
}

func (s SourceJotformUpdateBasic) MarshalJSON() ([]byte, error) {
	return utils.MarshalJSON(s, "", false)
}

func (s *SourceJotformUpdateBasic) UnmarshalJSON(data []byte) error {
	if err := utils.UnmarshalJSON(data, &s, "", false, true); err != nil {
		return err
	}
	return nil
}

func (o *SourceJotformUpdateBasic) GetAPIEndpoint() *SourceJotformUpdateSchemasAPIEndpointAPIEndpoint {
	return SourceJotformUpdateSchemasAPIEndpointAPIEndpointBasic.ToPointer()
}

func (o *SourceJotformUpdateBasic) GetURLPrefix() *SourceJotformUpdateBaseURLPrefix {
	if o == nil {
		return nil
	}
	return o.URLPrefix
}

type SourceJotformUpdateAPIEndpointType string

const (
	SourceJotformUpdateAPIEndpointTypeSourceJotformUpdateBasic      SourceJotformUpdateAPIEndpointType = "source-jotform-update_Basic"
	SourceJotformUpdateAPIEndpointTypeSourceJotformUpdateEnterprise SourceJotformUpdateAPIEndpointType = "source-jotform-update_Enterprise"
)

type SourceJotformUpdateAPIEndpoint struct {
	SourceJotformUpdateBasic      *SourceJotformUpdateBasic      `queryParam:"inline"`
	SourceJotformUpdateEnterprise *SourceJotformUpdateEnterprise `queryParam:"inline"`

	Type SourceJotformUpdateAPIEndpointType
}

func CreateSourceJotformUpdateAPIEndpointSourceJotformUpdateBasic(sourceJotformUpdateBasic SourceJotformUpdateBasic) SourceJotformUpdateAPIEndpoint {
	typ := SourceJotformUpdateAPIEndpointTypeSourceJotformUpdateBasic

	return SourceJotformUpdateAPIEndpoint{
		SourceJotformUpdateBasic: &sourceJotformUpdateBasic,
		Type:                     typ,
	}
}

func CreateSourceJotformUpdateAPIEndpointSourceJotformUpdateEnterprise(sourceJotformUpdateEnterprise SourceJotformUpdateEnterprise) SourceJotformUpdateAPIEndpoint {
	typ := SourceJotformUpdateAPIEndpointTypeSourceJotformUpdateEnterprise

	return SourceJotformUpdateAPIEndpoint{
		SourceJotformUpdateEnterprise: &sourceJotformUpdateEnterprise,
		Type:                          typ,
	}
}

func (u *SourceJotformUpdateAPIEndpoint) UnmarshalJSON(data []byte) error {

	var sourceJotformUpdateBasic SourceJotformUpdateBasic = SourceJotformUpdateBasic{}
	if err := utils.UnmarshalJSON(data, &sourceJotformUpdateBasic, "", true, true); err == nil {
		u.SourceJotformUpdateBasic = &sourceJotformUpdateBasic
		u.Type = SourceJotformUpdateAPIEndpointTypeSourceJotformUpdateBasic
		return nil
	}

	var sourceJotformUpdateEnterprise SourceJotformUpdateEnterprise = SourceJotformUpdateEnterprise{}
	if err := utils.UnmarshalJSON(data, &sourceJotformUpdateEnterprise, "", true, true); err == nil {
		u.SourceJotformUpdateEnterprise = &sourceJotformUpdateEnterprise
		u.Type = SourceJotformUpdateAPIEndpointTypeSourceJotformUpdateEnterprise
		return nil
	}

	return fmt.Errorf("could not unmarshal `%s` into any supported union types for SourceJotformUpdateAPIEndpoint", string(data))
}

func (u SourceJotformUpdateAPIEndpoint) MarshalJSON() ([]byte, error) {
	if u.SourceJotformUpdateBasic != nil {
		return utils.MarshalJSON(u.SourceJotformUpdateBasic, "", true)
	}

	if u.SourceJotformUpdateEnterprise != nil {
		return utils.MarshalJSON(u.SourceJotformUpdateEnterprise, "", true)
	}

	return nil, errors.New("could not marshal union type SourceJotformUpdateAPIEndpoint: all fields are null")
}

type SourceJotformUpdate struct {
	APIEndpoint SourceJotformUpdateAPIEndpoint `json:"api_endpoint"`
	APIKey      string                         `json:"api_key"`
	EndDate     time.Time                      `json:"end_date"`
	StartDate   time.Time                      `json:"start_date"`
}

func (s SourceJotformUpdate) MarshalJSON() ([]byte, error) {
	return utils.MarshalJSON(s, "", false)
}

func (s *SourceJotformUpdate) UnmarshalJSON(data []byte) error {
	if err := utils.UnmarshalJSON(data, &s, "", false, false); err != nil {
		return err
	}
	return nil
}

func (o *SourceJotformUpdate) GetAPIEndpoint() SourceJotformUpdateAPIEndpoint {
	if o == nil {
		return SourceJotformUpdateAPIEndpoint{}
	}
	return o.APIEndpoint
}

func (o *SourceJotformUpdate) GetAPIKey() string {
	if o == nil {
		return ""
	}
	return o.APIKey
}

func (o *SourceJotformUpdate) GetEndDate() time.Time {
	if o == nil {
		return time.Time{}
	}
	return o.EndDate
}

func (o *SourceJotformUpdate) GetStartDate() time.Time {
	if o == nil {
		return time.Time{}
	}
	return o.StartDate
}
