/*
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 GamePaceApiService service

/*
GamePaceApiService View time of game info
 * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
 * @param optional nil or *GamePaceApiGamePaceOpts - Optional Parameters:
     * @param "Season" (optional.String) -  Season of play
     * @param "TeamId" (optional.Int32) -  Unique Team Identifier. Format: 141, 147, etc
     * @param "TeamIds" (optional.Interface of []int32) -  Comma delimited list of Unique Team identifiers
     * @param "LeagueId" (optional.Int32) -  Unique League Identifier
     * @param "LeagueIds" (optional.Interface of []int32) -  Comma delimited list of Unique league identifiers
     * @param "LeagueListId" (optional.Interface of LeagueListsEnum) -  Unique League List Identifier
     * @param "SportId" (optional.Int32) -  Top level organization of a sport
     * @param "SportIds" (optional.Interface of []int32) -  Comma delimited list of top level organizations of a sport
     * @param "GameType" (optional.Interface of models.GameTypeEnum) -  Type of Game. Available types in /api/v1/gameTypes
     * @param "StartDate" (optional.String) -  Start date for range of data (must be used with end date). Format: MM/DD/YYYY
     * @param "EndDate" (optional.String) -  End date for range of data (must be used with start date). Format: MM/DD/YYYY
     * @param "VenueIds" (optional.Interface of []int32) -  Comma delimited list of Unique venue identifiers
     * @param "ExcludeVenueIds" (optional.Interface of []int32) -  Comma delimited list of Unique venue identifiers
     * @param "ExcludeGamePks" (optional.Interface of []int32) -  Comma delimited list of unique primary keys
     * @param "OrgType" (optional.Interface of OrganizationType) -  Organization level. Format: T(Team), L(League), S(Sport)
     * @param "IncludeChildren" (optional.Bool) -  Determines weather to include results from an organization&#x27;s children (ex. a sport would also include results for the teams and leagues)
     * @param "Fields" (optional.Interface of []string) -  Comma delimited list of specific fields to be returned. Format: topLevelNode, childNode, attribute
@return models.GamePaceWrapperRestObject
*/

type GamePaceApiGamePaceOpts struct {
	Season          optional.String
	TeamId          optional.Int32
	TeamIds         optional.Interface
	LeagueId        optional.Int32
	LeagueIds       optional.Interface
	LeagueListId    optional.Interface
	SportId         optional.Int32
	SportIds        optional.Interface
	GameType        optional.Interface
	StartDate       optional.String
	EndDate         optional.String
	VenueIds        optional.Interface
	ExcludeVenueIds optional.Interface
	ExcludeGamePks  optional.Interface
	OrgType         optional.Interface
	IncludeChildren optional.Bool
	Fields          optional.Interface
}

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

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

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

	if localVarOptionals != nil && localVarOptionals.Season.IsSet() {
		localVarQueryParams.Add("season", parameterToString(localVarOptionals.Season.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.TeamId.IsSet() {
		localVarQueryParams.Add("teamId", parameterToString(localVarOptionals.TeamId.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.TeamIds.IsSet() {
		localVarQueryParams.Add("teamIds", parameterToString(localVarOptionals.TeamIds.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.LeagueId.IsSet() {
		localVarQueryParams.Add("leagueId", parameterToString(localVarOptionals.LeagueId.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.LeagueIds.IsSet() {
		localVarQueryParams.Add("leagueIds", parameterToString(localVarOptionals.LeagueIds.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.LeagueListId.IsSet() {
		localVarQueryParams.Add("leagueListId", parameterToString(localVarOptionals.LeagueListId.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.SportId.IsSet() {
		localVarQueryParams.Add("sportId", parameterToString(localVarOptionals.SportId.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.SportIds.IsSet() {
		localVarQueryParams.Add("sportIds", parameterToString(localVarOptionals.SportIds.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.GameType.IsSet() {
		localVarQueryParams.Add("gameType", parameterToString(localVarOptionals.GameType.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.StartDate.IsSet() {
		localVarQueryParams.Add("startDate", parameterToString(localVarOptionals.StartDate.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.EndDate.IsSet() {
		localVarQueryParams.Add("endDate", parameterToString(localVarOptionals.EndDate.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.VenueIds.IsSet() {
		localVarQueryParams.Add("venueIds", parameterToString(localVarOptionals.VenueIds.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.ExcludeVenueIds.IsSet() {
		localVarQueryParams.Add("excludeVenueIds", parameterToString(localVarOptionals.ExcludeVenueIds.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.ExcludeGamePks.IsSet() {
		localVarQueryParams.Add("excludeGamePks", parameterToString(localVarOptionals.ExcludeGamePks.Value(), "multi"))
	}
	if localVarOptionals != nil && localVarOptionals.OrgType.IsSet() {
		localVarQueryParams.Add("orgType", parameterToString(localVarOptionals.OrgType.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.IncludeChildren.IsSet() {
		localVarQueryParams.Add("includeChildren", parameterToString(localVarOptionals.IncludeChildren.Value(), ""))
	}
	if localVarOptionals != nil && localVarOptionals.Fields.IsSet() {
		localVarQueryParams.Add("fields", parameterToString(localVarOptionals.Fields.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.GamePaceWrapperRestObject
			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
}
