// Copyright 2023 Harness, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package enum

import (
	"fmt"
	"strings"
)

// BranchSortOption specifies the available sort options for branches.
type BranchSortOption int

const (
	BranchSortOptionDefault BranchSortOption = iota
	BranchSortOptionName
	BranchSortOptionDate
)

// ParseBranchSortOption parses the branch sort option string
// and returns the equivalent enumeration.
func ParseBranchSortOption(s string) BranchSortOption {
	switch strings.ToLower(s) {
	case name:
		return BranchSortOptionName
	case date:
		return BranchSortOptionDate
	default:
		return BranchSortOptionDefault
	}
}

// String returns a string representation of the branch sort option.
func (o BranchSortOption) String() string {
	switch o {
	case BranchSortOptionName:
		return name
	case BranchSortOptionDate:
		return date
	case BranchSortOptionDefault:
		return defaultString
	default:
		return undefined
	}
}

// TagSortOption specifies the available sort options for tags.
type TagSortOption int

const (
	TagSortOptionDefault TagSortOption = iota
	TagSortOptionName
	TagSortOptionDate
)

// ParseTagSortOption parses the tag sort option string
// and returns the equivalent enumeration.
func ParseTagSortOption(s string) TagSortOption {
	switch strings.ToLower(s) {
	case name:
		return TagSortOptionName
	case date:
		return TagSortOptionDate
	default:
		return TagSortOptionDefault
	}
}

// String returns a string representation of the tag sort option.
func (o TagSortOption) String() string {
	switch o {
	case TagSortOptionName:
		return name
	case TagSortOptionDate:
		return date
	case TagSortOptionDefault:
		return defaultString
	default:
		return undefined
	}
}

// GitServiceType represents the different types of service values send by git's smart http protocol.
// See https://git-scm.com/docs/http-protocol#_smart_clients for more details.
type GitServiceType string

const (
	// GitServiceTypeReceivePack is sent by git push operations (server "receives" data from client).
	GitServiceTypeReceivePack GitServiceType = "receive-pack"
	// GitServiceTypeUploadPack is sent by git pull operations (server "uploads" data to client).
	GitServiceTypeUploadPack GitServiceType = "upload-pack"
)

// ParseGitServiceType parses the git service type string and returns the equivalent enumeration.
// If the value is unknown and doesn't represent a git service type, an error is returned.
func ParseGitServiceType(s string) (GitServiceType, error) {
	switch strings.ToLower(s) {
	case string(GitServiceTypeReceivePack):
		return GitServiceTypeReceivePack, nil
	case string(GitServiceTypeUploadPack):
		return GitServiceTypeUploadPack, nil
	default:
		return "", fmt.Errorf("unknown git service type provided: %q", s)
	}
}