package oauth2

import (
	"errors"
	"github.com/tidbcloud/auth-server/internal/entity"
	"strconv"
	"time"
)

// Only used for generating swagger doc
// for ops
type InnerQueryUserAuthorizedAppsRequest struct {
	OrgID        string `form:"org_id" json:"org_id"`
	UserID       string `form:"user_id" json:"user_id"`
	UserEmail    string `form:"user_email" json:"user_email"`
	parsedOrgID  uint64
	parsedUserID uint64
}

type InnerCreateApplicationRequest struct {
	Name        string `form:"name" json:"name"`
	ClientID    string `form:"client_id" json:"client_id"`
	RedirectURI string `form:"redirect_uri" json:"redirect_uri"`
	GrantType   string `form:"grant_type" json:"grant_type"`
	Description string `form:"description" json:"description"`
	OrgRole     string `form:"org_role" json:"org_role"`
	ProjectRole string `form:"project_role" json:"project_role"`
}

type InnerQueryUserAuthorizedAppsResponse struct {
	InnerBasicResponse
	Applications []UserAuthorizedApp `json:"applications"`
}
type InnerApplication struct {
	Id                    uint64    `json:"id,omitempty"`
	Name                  string    `json:"name,omitempty"`
	ClientId              string    `json:"client_id,omitempty"`
	GrantType             string    `json:"grant_typ,omitempty"`
	Scopes                string    `json:"scopes,omitempty"`
	HomePageUri           string    `json:"home_page_uri,omitempty"`
	LogoURILight          string    `json:"logo_uri_light,omitempty"`
	LogoURIDark           string    `json:"logo_uri_dark,omitempty"`
	AccessTokenExpiresIn  string    `json:"access_token_expires_in,omitempty"`
	RefreshTokenExpiresIn string    `json:"refresh_token_expires_in,omitempty"`
	CreatedAt             time.Time `json:"created_at,omitempty"`

	UpdatedAt time.Time `json:"updated_at,omitempty"`
}
type UserAuthorizedApp struct {
	Id           uint64     `json:"id,omitempty"`
	Name         string     `json:"name,omitempty"`
	Company      string     `json:"company,omitempty"`
	GrantType    string     `json:"grant_typ,omitempty"`
	HomePageUri  string     `json:"home_page_uri,omitempty"`
	CompanyUri   string     `json:"company_uri,omitempty"`
	LogoURILight string     `json:"logo_uri_light,omitempty"`
	LogoURIDark  string     `json:"logo_uri_dark,omitempty"`
	Authorized   bool       `json:"authorized"`
	Description  string     `json:"description,omitempty"`
	LastUsedAt   *time.Time `json:"last_used_at,omitempty"`
}

func (r *InnerQueryUserAuthorizedAppsRequest) ValidateInnerQueryUserAuthorizedApps() error {
	if r.OrgID != "" {
		parseOrgId, err := strconv.ParseUint(r.OrgID, 10, 64)
		if err != nil {
			return errors.New("org_id is invalid")
		}
		r.parsedOrgID = parseOrgId
	}
	if r.UserID != "" {
		parseId, err := strconv.ParseUint(r.UserID, 10, 64)
		if err != nil {
			return errors.New("org_id is invalid")
		}
		r.parsedUserID = parseId
	}

	return nil
}
func (r *InnerQueryUserAuthorizedAppsRequest) GetParsedOrgID() uint64 {

	return r.parsedOrgID
}

func (r *InnerQueryUserAuthorizedAppsRequest) GetParsedUserID() uint64 {
	if r.parsedUserID != 0 {
		return r.parsedUserID
	}
	if r.UserID != "" {
		parseId, _ := strconv.ParseUint(r.UserID, 10, 64)
		r.parsedUserID = parseId

	}
	return r.parsedUserID
}

type QueryAppsParam struct {
	Ids        []uint64
	Names      []string
	ClientIds  []string
	GrantTypes []entity.Oauth2GrantType
	Types      []entity.ApplicationType
}

// Only used for generating swagger doc
type ApplicationRequest struct {
	ApplicationID uint64 `form:"application_id" json:"application_id"`
}

func (r *ApplicationRequest) Validate() error {
	if r.ApplicationID == 0 {
		return errors.New("application_id is required")
	}

	return nil
}
