/*
Copyright (C) 2025 filifa

This file is part of mlbstats.

mlbstats is free software: you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.

mlbstats is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
mlbstats. If not, see <https://www.gnu.org/licenses/>.
*/

/*
 * Stats API Documentation
 *
 * Official API for Major League Baseball.
 *
 * API version: 2.0.0
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package api

import (
	"context"
	"github.com/antihax/optional"
	"io/ioutil"
	"net/http"
	"net/url"
	"scm.dairydemon.net/filifa/mlbstats/api/models"
	"strings"
)

// Linger please
var (
	_ context.Context
)

type StreaksApiService service

/*
StreaksApiService View streaks
 * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
 * @param optional nil or *StreaksApiGetStreaksOpts - Optional Parameters:
     * @param "StreakOrg" (optional.Interface of OrganizationType) -
     * @param "StreakStat" (optional.Interface of []StreakStatEnum) -
     * @param "StreakSpan" (optional.Interface of StreakSpanEnum) -
     * @param "StreakLevel" (optional.Interface of StreakLevelEnum) -
     * @param "StreakThreshold" (optional.Int32) -
     * @param "Inverse" (optional.Bool) -
     * @param "StartersOnly" (optional.Bool) -
     * @param "StatGroup" (optional.Interface of []StatGroup) -  Category of statistic to return. Available types in /api/v1/statGroups
     * @param "GameType" (optional.Interface of []models.GameTypeEnum) -  Type of Game. Available types in /api/v1/gameTypes
     * @param "Season" (optional.Interface of []string) -  Season of play
     * @param "TeamId" (optional.Interface of []int32) -  Unique Team Identifier. Format: 141, 147, etc
     * @param "LeagueId" (optional.Interface of []int32) -  Unique League Identifier
     * @param "SportId" (optional.Interface of []int32) -  Top level organization of a sport
     * @param "ActiveStreak" (optional.Bool) -  Whether or not a player is active
     * @param "Limit" (optional.Int32) -  Number of results to return
     * @param "Fields" (optional.Interface of []string) -  Comma delimited list of specific fields to be returned. Format: topLevelNode, childNode, attribute
     * @param "PlayerId" (optional.Interface of []int32) -  A unique identifier for a player
@return models.StreaksWrapperRestObject
*/

type StreaksApiGetStreaksOpts struct {
	StreakOrg       optional.Interface
	StreakStat      optional.Interface
	StreakSpan      optional.Interface
	StreakLevel     optional.Interface
	StreakThreshold optional.Int32
	Inverse         optional.Bool
	StartersOnly    optional.Bool
	StatGroup       optional.Interface
	GameType        optional.Interface
	Season          optional.Interface
	TeamId          optional.Interface
	LeagueId        optional.Interface
	SportId         optional.Interface
	ActiveStreak    optional.Bool
	Limit           optional.Int32
	Fields          optional.Interface
	PlayerId        optional.Interface
}

func (a *StreaksApiService) GetStreaks(ctx context.Context, localVarOptionals *StreaksApiGetStreaksOpts) (models.StreaksWrapperRestObject, *http.Response, error) {
	var (
		localVarHttpMethod  = strings.ToUpper("Get")
		localVarPostBody    interface{}
		localVarFileName    string
		localVarFileBytes   []byte
		localVarReturnValue models.StreaksWrapperRestObject
	)

	// create path and map variables
	localVarPath := a.client.cfg.BasePath + "/api/v1/streaks"

	localVarHeaderParams := make(map[string]string)
	localVarQueryParams := url.Values{}
	localVarFormParams := url.Values{}

	if localVarOptionals != nil && localVarOptionals.StreakOrg.IsSet() {
		localVarQueryParams.Add("streakOrg", parameterToString(localVarOptionals.StreakOrg.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.StreakStat.IsSet() {
		localVarQueryParams.Add("streakStat", parameterToString(localVarOptionals.StreakStat.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.StreakSpan.IsSet() {
		localVarQueryParams.Add("streakSpan", parameterToString(localVarOptionals.StreakSpan.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.StreakLevel.IsSet() {
		localVarQueryParams.Add("streakLevel", parameterToString(localVarOptionals.StreakLevel.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.StreakThreshold.IsSet() {
		localVarQueryParams.Add("streakThreshold", parameterToString(localVarOptionals.StreakThreshold.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.Inverse.IsSet() {
		localVarQueryParams.Add("inverse", parameterToString(localVarOptionals.Inverse.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.StartersOnly.IsSet() {
		localVarQueryParams.Add("startersOnly", parameterToString(localVarOptionals.StartersOnly.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.StatGroup.IsSet() {
		localVarQueryParams.Add("statGroup", parameterToString(localVarOptionals.StatGroup.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.GameType.IsSet() {
		localVarQueryParams.Add("gameType", parameterToString(localVarOptionals.GameType.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.Season.IsSet() {
		localVarQueryParams.Add("season", parameterToString(localVarOptionals.Season.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.TeamId.IsSet() {
		localVarQueryParams.Add("teamId", parameterToString(localVarOptionals.TeamId.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.LeagueId.IsSet() {
		localVarQueryParams.Add("leagueId", parameterToString(localVarOptionals.LeagueId.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.SportId.IsSet() {
		localVarQueryParams.Add("sportId", parameterToString(localVarOptionals.SportId.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.ActiveStreak.IsSet() {
		localVarQueryParams.Add("activeStreak", parameterToString(localVarOptionals.ActiveStreak.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.Limit.IsSet() {
		localVarQueryParams.Add("limit", parameterToString(localVarOptionals.Limit.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.Fields.IsSet() {
		localVarQueryParams.Add("fields", parameterToString(localVarOptionals.Fields.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.PlayerId.IsSet() {
		localVarQueryParams.Add("playerId", parameterToString(localVarOptionals.PlayerId.Value(), "multi"))
	}
	// to determine the Content-Type header
	localVarHttpContentTypes := []string{}

	// set Content-Type header
	localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
	if localVarHttpContentType != "" {
		localVarHeaderParams["Content-Type"] = localVarHttpContentType
	}

	// to determine the Accept header
	localVarHttpHeaderAccepts := []string{"*/*"}

	// set Accept header
	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
	if localVarHttpHeaderAccept != "" {
		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
	}
	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
	if err != nil {
		return localVarReturnValue, nil, err
	}

	localVarHttpResponse, err := a.client.callAPI(r)
	if err != nil || localVarHttpResponse == nil {
		return localVarReturnValue, localVarHttpResponse, err
	}

	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
	localVarHttpResponse.Body.Close()
	if err != nil {
		return localVarReturnValue, localVarHttpResponse, err
	}

	if localVarHttpResponse.StatusCode < 300 {
		// If we succeed, return the data, otherwise pass on to decode error.
		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
		if err == nil {
			return localVarReturnValue, localVarHttpResponse, err
		}
	}

	if localVarHttpResponse.StatusCode >= 300 {
		newErr := GenericSwaggerError{
			body:  localVarBody,
			error: localVarHttpResponse.Status,
		}
		if localVarHttpResponse.StatusCode == 200 {
			var v models.StreaksWrapperRestObject
			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
			if err != nil {
				newErr.error = err.Error()
				return localVarReturnValue, localVarHttpResponse, newErr
			}
			newErr.model = v
			return localVarReturnValue, localVarHttpResponse, newErr
		}
		return localVarReturnValue, localVarHttpResponse, newErr
	}

	return localVarReturnValue, localVarHttpResponse, nil
}

/*
StreaksApiService View streaks parameter options
  - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().

@return map[string][]interface{}
*/
func (a *StreaksApiService) StreakTypes(ctx context.Context) (map[string][]interface{}, *http.Response, error) {
	var (
		localVarHttpMethod  = strings.ToUpper("Get")
		localVarPostBody    interface{}
		localVarFileName    string
		localVarFileBytes   []byte
		localVarReturnValue map[string][]interface{}
	)

	// create path and map variables
	localVarPath := a.client.cfg.BasePath + "/api/v1/streaks/types"

	localVarHeaderParams := make(map[string]string)
	localVarQueryParams := url.Values{}
	localVarFormParams := url.Values{}

	// to determine the Content-Type header
	localVarHttpContentTypes := []string{}

	// set Content-Type header
	localVarHttpContentType := selectHeaderContentType(localVarHttpContentTypes)
	if localVarHttpContentType != "" {
		localVarHeaderParams["Content-Type"] = localVarHttpContentType
	}

	// to determine the Accept header
	localVarHttpHeaderAccepts := []string{"*/*"}

	// set Accept header
	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
	if localVarHttpHeaderAccept != "" {
		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
	}
	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
	if err != nil {
		return localVarReturnValue, nil, err
	}

	localVarHttpResponse, err := a.client.callAPI(r)
	if err != nil || localVarHttpResponse == nil {
		return localVarReturnValue, localVarHttpResponse, err
	}

	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
	localVarHttpResponse.Body.Close()
	if err != nil {
		return localVarReturnValue, localVarHttpResponse, err
	}

	if localVarHttpResponse.StatusCode < 300 {
		// If we succeed, return the data, otherwise pass on to decode error.
		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
		if err == nil {
			return localVarReturnValue, localVarHttpResponse, err
		}
	}

	if localVarHttpResponse.StatusCode >= 300 {
		newErr := GenericSwaggerError{
			body:  localVarBody,
			error: localVarHttpResponse.Status,
		}
		if localVarHttpResponse.StatusCode == 200 {
			var v map[string][]interface{}
			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
			if err != nil {
				newErr.error = err.Error()
				return localVarReturnValue, localVarHttpResponse, newErr
			}
			newErr.model = v
			return localVarReturnValue, localVarHttpResponse, newErr
		}
		return localVarReturnValue, localVarHttpResponse, newErr
	}

	return localVarReturnValue, localVarHttpResponse, nil
}
