// Quickstart: connect to an M-Files vault, log in, list the 10 most recently modified
// documents and log out.
//
// Configure with MFILES_ADDRESS, MFILES_TLS, MFILES_VAULT, MFILES_USERNAME and MFILES_PASSWORD
// (see README.md), then: go run ./quickstart
package main

import (
	"context"
	"fmt"
	"log"
	"time"

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

func main() {
	if err := run(); err != nil {
		log.Fatal(err)
	}
}

func run() error {
	ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
	defer cancel()

	// [START quickstart]
	// Connect and log in with the settings in the MFILES_* environment variables.
	cfg, err := mfilesclient.ConfigFromEnv()
	if err != nil {
		return err
	}
	cfg.ClientName = "M-Files gRPC quickstart"
	client, err := mfilesclient.Connect(ctx, cfg)
	if err != nil {
		return err
	}
	defer client.Close() // logs out and closes the channel

	// Documents (object type 0) that are not deleted, sorted by "Last modified" (property 21),
	// newest first. The server sorts before it applies the limit.
	search := mfiles.NewIRPCSearchClient(client.Conn)
	response, err := search.SearchObjects(ctx, &mfiles.SearchObjectsRequest{
		Conditions: mfilesclient.AllOf(mfilesclient.IsObjectType(0), mfilesclient.IsNotDeleted()),
		Sorting:    mfilesclient.SortBy(21, true),
		Limit:      10,
	})
	if err != nil {
		return err
	}

	for _, item := range response.GetResults() {
		object := item.GetObject()
		version := object.GetVersionInfo()
		fmt.Printf("%s (ID %d, version %d, modified %s UTC)\n",
			version.GetTitle(),
			object.GetObjectInfo().GetObjId().GetItemId().GetInternalId(),
			version.GetVersion().GetInternalVersion(),
			version.GetLastModifiedAtUtc().AsTime().Format(time.DateTime))
	}
	// [END quickstart]
	return nil
}
