package main

import (
	"fmt"
	"io/ioutil"
	"log"

	"context"

	"cloud.google.com/go/storage"

	"golang.org/x/oauth2/google"
	admin "google.golang.org/api/admin/directory/v1"
	driveactivity "google.golang.org/api/driveactivity/v2"
	"google.golang.org/api/iterator"
	"google.golang.org/api/option"
)



func main() {
	serviceAccountFile := "/path/to/your/svc.json"
	serviceAccountJSON, err := ioutil.ReadFile(serviceAccountFile)
	if err != nil {
		log.Fatal(err)
	}

	config, err := google.JWTConfigFromJSON(serviceAccountJSON,
		admin.AdminDirectoryUserScope, driveactivity.DriveActivityReadonlyScope, "https://www.googleapis.com/auth/cloud-platform",
	)

	config.Subject = "user1@yourdomain.com"

	ctx := context.Background()
	storageClient, err := storage.NewClient(ctx, option.WithTokenSource(config.TokenSource(ctx)))
	if err != nil {
		log.Fatalf("%v", err)
	}

	bucketName := "somebucketName"

	it := storageClient.Bucket(bucketName).Objects(ctx, nil)
	for {

		attrs, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			log.Fatal(err)
		}
		log.Println(attrs.Name)
	}

	srv, err := admin.New(config.Client(context.Background()))
	if err != nil {
		log.Fatal(err)
	}

	usersReport, err := srv.Users.List().Customer("yourcxnumber").MaxResults(10).OrderBy("email").Do()
	if err != nil {
		log.Fatal(err)
	}

	if len(usersReport.Users) == 0 {
		fmt.Print("No users found.\n")
	} else {
		fmt.Print("Users:\n")
		for _, u := range usersReport.Users {
			fmt.Printf("%s (%s)\n", u.PrimaryEmail, u.Name.FullName)
		}
	}

	// **************************************
	//https://developers.google.com/admin-sdk/reports/v1/appendix/activity/drive
	dsrv, err := driveactivity.New(config.Client(context.Background()))
	if err != nil {
		log.Fatalf("Unable to retrieve driveactivity Client %v", err)
	}

	q := driveactivity.QueryDriveActivityRequest{PageSize: 10}
	r, err := dsrv.Activity.Query(&q).Do()
	if err != nil {
		log.Fatalf("Unable to retrieve list of activities. %v", err)
	}

	fmt.Println("Recent Activity:")
	if len(r.Activities) > 0 {
		for _, a := range r.Activities {
			log.Printf("%v, \n", a)
		}
	} else {
		fmt.Print("No activity.")
	}

}