package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"go-micro.dev/v6"
	"go-micro.dev/v6/auth"
	"go-micro.dev/v6/auth/noop"
	"go-micro.dev/v6/client"
	authWrapper "go-micro.dev/v6/wrapper/auth"

	pb "go-micro.dev/v6/examples/auth/proto"
)

func main() {
	// Get token from environment or generate one
	token := os.Getenv("TOKEN")

	// Create auth provider (same as server)
	authProvider := noop.NewAuth()

	// If no token provided, generate one
	if token == "" {
		log.Println("No TOKEN env var provided, generating test token...")
		acc, err := authProvider.Generate("test-user")
		if err != nil {
			log.Fatal(err)
		}

		t, err := authProvider.Token(auth.WithCredentials(acc.ID, acc.Secret))
		if err != nil {
			log.Fatal(err)
		}

		token = t.AccessToken
		log.Printf("Generated token: %s\n", token)
	}

	// Create service with auth client wrapper
	service := micro.NewService("greeter.client", micro.WrapClient(
		authWrapper.FromToken(token), // Add token to all requests
	),
	)

	service.Init()

	// Create greeter client
	greeterClient := pb.NewGreeterService("greeter", service.Client())

	// Test 1: Call protected endpoint (Hello) with auth
	fmt.Println("\n=== Test 1: Protected endpoint WITH auth ===")
	rsp, err := greeterClient.Hello(context.Background(), &pb.Request{Name: "John"})
	if err != nil {
		log.Printf("Error: %v", err)
	} else {
		fmt.Printf("Response: %s\n", rsp.Msg)
	}

	// Test 2: Call public endpoint (Health) without auth
	fmt.Println("\n=== Test 2: Public endpoint (no auth needed) ===")
	// Create client without auth wrapper for this test
	plainClient := client.NewClient()
	plainGreeterClient := pb.NewGreeterService("greeter", plainClient)

	healthRsp, err := plainGreeterClient.Health(context.Background(), &pb.HealthRequest{})
	if err != nil {
		log.Printf("Error: %v", err)
	} else {
		fmt.Printf("Health Status: %s\n", healthRsp.Status)
	}

	// Test 3: Call protected endpoint WITHOUT auth (should fail)
	fmt.Println("\n=== Test 3: Protected endpoint WITHOUT auth (should fail) ===")
	_, err = plainGreeterClient.Hello(context.Background(), &pb.Request{Name: "John"})
	if err != nil {
		fmt.Printf("Expected error: %v\n", err)
	} else {
		fmt.Println("Unexpected: Call succeeded without auth!")
	}
}
