package authorizationserver

import (
	"net/http"
	"github.com/azukaar/cosmos-server/src/utils"
)

func authEndpoint(rw http.ResponseWriter, req *http.Request) {
	// This context will be passed to all methods.
	ctx := req.Context()
	
	if utils.LoggedInOnly(rw, req) != nil {
		return
	}

	nickname := req.Header.Get("x-cosmos-user")
	
	hostname := utils.GetMainConfig().HTTPConfig.Hostname
	if utils.IsHTTPS {
		hostname = "https://" + hostname
	} else {
		hostname = "http://" + hostname
	}

	// Let's create an AuthorizeRequest object!
	// It will analyze the request and extract important information like scopes, response type and others.
	ar, err := oauth2.NewAuthorizeRequest(ctx, req)
	if err != nil {
		utils.Error("Error occurred in NewAuthorizeRequest:", err)
		oauth2.WriteAuthorizeError(ctx, rw, ar, err)
		return
	}

	// let's see what scopes the user gave consent to
	for _, scope := range req.PostForm["scopes"] {
		ar.GrantScope(scope)
	}

	// Now that the user is authorized, we set up a session:
	mySessionData := newSession(nickname, req)

	// Now we need to get a response. This is the place where the AuthorizeEndpointHandlers kick in and start processing the request.
	// NewAuthorizeResponse is capable of running multiple response type handlers which in turn enables this library
	// to support open id connect.

	response, err := oauth2.NewAuthorizeResponse(ctx, ar, mySessionData)

	// Catch any errors, e.g.:
	// * unknown client
	if err != nil {
		utils.Error("Error occurred in NewAuthorizeResponse:", err)
		oauth2.WriteAuthorizeError(ctx, rw, ar, err)
		return
	}

	// Last but not least, send the response!
	oauth2.WriteAuthorizeResponse(ctx, rw, ar, response)
}
