package auth

import (
	
	
	

	
	
	
	

	
)

type Keycloak struct {
	Client *gocloak.GoCloak
	Ctx    context.Context
}

var (
	keycloak Keycloak
)

func ( string) (*models.Oauth2Token, error) {
	 := &models.Oauth2Token{}
	 := database.Connection().First(&, "user_id = ?", ).Error
	if  != nil {
		return nil, 
	}
	return , nil
}

func ( string) error {
	,  := GetOauth2Token()
	if  != nil {
		return errors.New("an error occured while getting keycloak token")
	}

	if keycloak.Client == nil {
		keycloak.Client = gocloak.NewClient(helpers.Env("KEYCLOAK_BASE_URL", ""))

		 := resty.New()
		.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
		keycloak.Client.SetRestyClient()

		keycloak.Ctx = context.Background()
	}

	,  := keycloak.Client.RetrospectToken(
		keycloak.Ctx,
		.RefreshToken,
		helpers.Env("KEYCLOAK_CLIENT_ID", ""),
		helpers.Env("KEYCLOAK_CLIENT_SECRET", ""),
		helpers.Env("KEYCLOAK_REALM", ""),
	)

	if  != nil {
		return errors.New("an error occured while retrospecting token")
	}

	if !*.Active {
		 := RefreshToken()
		if  != nil {
			return 
		}
	}

	return nil
}

func ( *models.Oauth2Token) error {
	,  := keycloak.Client.RefreshToken(
		keycloak.Ctx,
		.RefreshToken,
		helpers.Env("KEYCLOAK_CLIENT_ID", ""),
		helpers.Env("KEYCLOAK_CLIENT_SECRET", ""),
		helpers.Env("KEYCLOAK_REALM", ""),
	)

	if  != nil {
		return errors.New("an error occured while refreshing token")
	}

	 = database.Connection().
		Model(&).
		Where("user_id = ?", .UserID).
		Updates(&models.Oauth2Token{
			AccessToken:      .AccessToken,
			RefreshToken:     .RefreshToken,
			ExpiresIn:        .ExpiresIn,
			RefreshExpiresIn: .RefreshExpiresIn,
		}).Error

	if  != nil {
		return errors.New("an error occured while updating token")
	}

	return nil
}