package oauth2

import "net/http"

// InfoRequest is a request for information about some AccessData
type InfoRequest struct {
	Code       string     // Code to look up
	AccessData AccessData // AccessData associated with Code
}

// HandleInfoRequest is an http.HandlerFunc for server information
// NOT an RFC specification.
func HandleInfoRequest(w http.ResponseWriter, r *http.Request, ctx Context) {
	r.ParseForm()

	// generate info request
	ret := InfoRequest{
		Code: r.Form.Get("code"),
	}

	if ret.Code == "" {
		// TODO: return error
		return
	}

	var err error

	// load access data
	ret.AccessData, err = loadAccess(ret.Code, ctx)
	if err != nil {
		// TODO: return error
		return
	}
	if ret.AccessData.Client.RedirectURI == "" {
		// TODO: return error
		return
	}
	if ret.AccessData.IsExpired() {
		// TODO: return error
		return
	}
	// TODO: write ret
}

// FinishInfoRequest finalizes the request handled by HandleInfoRequest
func FinishInfoRequest(w http.ResponseWriter, r *http.Request, ir *InfoRequest, ctx Context) {
	// output data
	//w.Output["client_id"] = ir.AccessData.Client.Id
	//w.Output["access_token"] = ir.AccessData.AccessToken
	//w.Output["token_type"] = s.Config.TokenType
	//w.Output["expires_in"] = ir.AccessData.CreatedAt.Add(time.Duration(ir.AccessData.ExpiresIn)*time.Second).Sub(time.Now()) / time.Second
	//if ir.AccessData.RefreshToken != "" {
	//	w.Output["refresh_token"] = ir.AccessData.RefreshToken
	//}
	//if ir.AccessData.Scope != "" {
	//	w.Output["scope"] = ir.AccessData.Scope
	//}
	// TODO: write output
}
