// 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 SourceGitlabUpdateSchemasAuthType string

const (
	SourceGitlabUpdateSchemasAuthTypeAccessToken SourceGitlabUpdateSchemasAuthType = "access_token"
)

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

type SourceGitlabUpdatePrivateToken struct {
	// Log into your Gitlab account and then generate a personal Access Token.
	AccessToken string                             `json:"access_token"`
	authType    *SourceGitlabUpdateSchemasAuthType `const:"access_token" json:"auth_type,omitempty"`
}

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

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

func (o *SourceGitlabUpdatePrivateToken) GetAccessToken() string {
	if o == nil {
		return ""
	}
	return o.AccessToken
}

func (o *SourceGitlabUpdatePrivateToken) GetAuthType() *SourceGitlabUpdateSchemasAuthType {
	return SourceGitlabUpdateSchemasAuthTypeAccessToken.ToPointer()
}

type SourceGitlabUpdateAuthType string

const (
	SourceGitlabUpdateAuthTypeOauth20 SourceGitlabUpdateAuthType = "oauth2.0"
)

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

type SourceGitlabUpdateOAuth20 struct {
	// Access Token for making authenticated requests.
	AccessToken string                      `json:"access_token"`
	authType    *SourceGitlabUpdateAuthType `const:"oauth2.0" json:"auth_type,omitempty"`
	// The API ID of the Gitlab developer application.
	ClientID string `json:"client_id"`
	// The API Secret the Gitlab developer application.
	ClientSecret string `json:"client_secret"`
	// The key to refresh the expired access_token.
	RefreshToken string `json:"refresh_token"`
	// The date-time when the access token should be refreshed.
	TokenExpiryDate time.Time `json:"token_expiry_date"`
}

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

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

func (o *SourceGitlabUpdateOAuth20) GetAccessToken() string {
	if o == nil {
		return ""
	}
	return o.AccessToken
}

func (o *SourceGitlabUpdateOAuth20) GetAuthType() *SourceGitlabUpdateAuthType {
	return SourceGitlabUpdateAuthTypeOauth20.ToPointer()
}

func (o *SourceGitlabUpdateOAuth20) GetClientID() string {
	if o == nil {
		return ""
	}
	return o.ClientID
}

func (o *SourceGitlabUpdateOAuth20) GetClientSecret() string {
	if o == nil {
		return ""
	}
	return o.ClientSecret
}

func (o *SourceGitlabUpdateOAuth20) GetRefreshToken() string {
	if o == nil {
		return ""
	}
	return o.RefreshToken
}

func (o *SourceGitlabUpdateOAuth20) GetTokenExpiryDate() time.Time {
	if o == nil {
		return time.Time{}
	}
	return o.TokenExpiryDate
}

type SourceGitlabUpdateAuthorizationMethodType string

const (
	SourceGitlabUpdateAuthorizationMethodTypeSourceGitlabUpdateOAuth20      SourceGitlabUpdateAuthorizationMethodType = "source-gitlab-update_OAuth2.0"
	SourceGitlabUpdateAuthorizationMethodTypeSourceGitlabUpdatePrivateToken SourceGitlabUpdateAuthorizationMethodType = "source-gitlab-update_Private Token"
)

type SourceGitlabUpdateAuthorizationMethod struct {
	SourceGitlabUpdateOAuth20      *SourceGitlabUpdateOAuth20      `queryParam:"inline"`
	SourceGitlabUpdatePrivateToken *SourceGitlabUpdatePrivateToken `queryParam:"inline"`

	Type SourceGitlabUpdateAuthorizationMethodType
}

func CreateSourceGitlabUpdateAuthorizationMethodSourceGitlabUpdateOAuth20(sourceGitlabUpdateOAuth20 SourceGitlabUpdateOAuth20) SourceGitlabUpdateAuthorizationMethod {
	typ := SourceGitlabUpdateAuthorizationMethodTypeSourceGitlabUpdateOAuth20

	return SourceGitlabUpdateAuthorizationMethod{
		SourceGitlabUpdateOAuth20: &sourceGitlabUpdateOAuth20,
		Type:                      typ,
	}
}

func CreateSourceGitlabUpdateAuthorizationMethodSourceGitlabUpdatePrivateToken(sourceGitlabUpdatePrivateToken SourceGitlabUpdatePrivateToken) SourceGitlabUpdateAuthorizationMethod {
	typ := SourceGitlabUpdateAuthorizationMethodTypeSourceGitlabUpdatePrivateToken

	return SourceGitlabUpdateAuthorizationMethod{
		SourceGitlabUpdatePrivateToken: &sourceGitlabUpdatePrivateToken,
		Type:                           typ,
	}
}

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

	var sourceGitlabUpdatePrivateToken SourceGitlabUpdatePrivateToken = SourceGitlabUpdatePrivateToken{}
	if err := utils.UnmarshalJSON(data, &sourceGitlabUpdatePrivateToken, "", true, true); err == nil {
		u.SourceGitlabUpdatePrivateToken = &sourceGitlabUpdatePrivateToken
		u.Type = SourceGitlabUpdateAuthorizationMethodTypeSourceGitlabUpdatePrivateToken
		return nil
	}

	var sourceGitlabUpdateOAuth20 SourceGitlabUpdateOAuth20 = SourceGitlabUpdateOAuth20{}
	if err := utils.UnmarshalJSON(data, &sourceGitlabUpdateOAuth20, "", true, true); err == nil {
		u.SourceGitlabUpdateOAuth20 = &sourceGitlabUpdateOAuth20
		u.Type = SourceGitlabUpdateAuthorizationMethodTypeSourceGitlabUpdateOAuth20
		return nil
	}

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

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

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

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

type SourceGitlabUpdate struct {
	// Please enter your basic URL from GitLab instance.
	APIURL      *string                               `default:"gitlab.com" json:"api_url"`
	Credentials SourceGitlabUpdateAuthorizationMethod `json:"credentials"`
	// List of groups. e.g. airbyte.io.
	GroupsList []string `json:"groups_list,omitempty"`
	// Space-delimited list of projects. e.g. airbyte.io/documentation meltano/tap-gitlab.
	ProjectsList []string `json:"projects_list,omitempty"`
	// The date from which you'd like to replicate data for GitLab API, in the format YYYY-MM-DDT00:00:00Z. Optional. If not set, all data will be replicated. All data generated after this date will be replicated.
	StartDate *time.Time `json:"start_date,omitempty"`
}

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

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

func (o *SourceGitlabUpdate) GetAPIURL() *string {
	if o == nil {
		return nil
	}
	return o.APIURL
}

func (o *SourceGitlabUpdate) GetCredentials() SourceGitlabUpdateAuthorizationMethod {
	if o == nil {
		return SourceGitlabUpdateAuthorizationMethod{}
	}
	return o.Credentials
}

func (o *SourceGitlabUpdate) GetGroupsList() []string {
	if o == nil {
		return nil
	}
	return o.GroupsList
}

func (o *SourceGitlabUpdate) GetProjectsList() []string {
	if o == nil {
		return nil
	}
	return o.ProjectsList
}

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