// Recipe "connect": the server version and capabilities before logging in, then log in, read
// the session, keep it alive and log out.
//
// Usage: go run ./recipes/connect
package main

import (
	"context"
	"fmt"

	"github.com/M-Files/mfiles-grpc-api-samples/mfilesclient"
	"github.com/M-Files/mfiles-grpc-api-samples/recipes/internal/recipe"
	"github.com/M-Files/mfiles-grpc-api/go/mfiles"
)

func main() {
	recipe.Main(run)
}

func run(ctx context.Context) error {
	cfg, err := mfilesclient.ConfigFromEnv()
	if err != nil {
		return err
	}
	cfg.ClientName = recipe.ClientName

	// [START connect]
	// Dial only creates the channel. Calls without a session work right away.
	client, err := mfilesclient.Dial(cfg)
	if err != nil {
		return err
	}
	defer client.Close()

	version, err := mfiles.NewIRPCQueryVersionClient(client.Conn).QueryVersion(ctx,
		&mfiles.QueryVersionRequest{})
	if err != nil {
		return err
	}
	fmt.Println("Server version:", mfilesclient.VersionString(version.GetServerVersion()))

	login := mfiles.NewIRPCLoginClient(client.Conn)
	capabilities, err := login.GetServerCapabilities(ctx, &mfiles.GetServerCapabilitiesRequest{})
	if err != nil {
		return err
	}
	fmt.Printf("Server capabilities: file_streaming=%v, facet_search=%v\n",
		capabilities.GetServerCapabilities().GetFileStreaming(),
		capabilities.GetServerCapabilities().GetFacetSearch())

	// Log in. From now on every call carries the session ID.
	session, err := client.LogIn(ctx, cfg)
	if err != nil {
		return err
	}
	fmt.Printf("Logged in as %s; keep-alive interval %d s\n",
		session.GetAccountName(), session.GetKeepAliveIntervalInSeconds())

	info, err := login.GetVaultSessionInfo(ctx, &mfiles.GetVaultSessionInfoRequest{})
	if err != nil {
		return err
	}
	fmt.Printf("Vault: %s %s\n", info.GetVaultSessionInfo().GetVaultDisplayName(),
		info.GetVaultSessionInfo().GetVaultGuid())
	// The latest value from the mfiles-metadata-version-bin trailer of the calls so far.
	if metadataStructureVersion, ok := client.MetadataStructureVersion(); ok {
		fmt.Println("Metadata structure version:", metadataStructureVersion)
	} else {
		fmt.Println("Metadata structure version: not reported")
	}

	// Call KeepAlive at least every keep-alive interval on long runs; other calls do not extend
	// the session.
	if _, err := login.KeepAlive(ctx, &mfiles.KeepAliveRequest{}); err != nil {
		return err
	}
	fmt.Println("KeepAlive: ok")

	if err := client.LogOut(ctx); err != nil {
		return err
	}
	fmt.Println("Logged out")
	// [END connect]
	return nil
}
