package main

import (
	"context"
	"flag"
	"fmt"
	"github.com/longjoy/micro-go-course/section32/config"
	"github.com/longjoy/micro-go-course/section32/endpoint"
	"github.com/longjoy/micro-go-course/section32/service"
	"github.com/longjoy/micro-go-course/section32/transport"
	"net/http"
	"os"
	"os/signal"
	"strconv"
	"syscall"
)

func main() {

	var (
		servicePort = flag.Int("service.port", 10099, "service port")
	)

	flag.Parse()

	ctx := context.Background()
	errChan := make(chan error)


	var tokenService service.ResourceServerTokenService
	var tokenEnhancer service.TokenEnhancer
	var tokenStore service.TokenStore
	var srv service.Service


	tokenEnhancer = service.NewJwtTokenEnhancer("secret")
	tokenStore = service.NewJwtTokenStore(tokenEnhancer.(*service.JwtTokenEnhancer))
	tokenService = service.NewTokenService(tokenStore, tokenEnhancer)




	srv = service.NewCommonService()


	indexEndpoint := endpoint.MakeIndexEndpoint(srv)
	sampleEndpoint := endpoint.MakeSampleEndpoint(srv)
	sampleEndpoint = endpoint.MakeOAuth2AuthorizationMiddleware(config.KitLogger)(sampleEndpoint)
	adminEndpoint := endpoint.MakeAdminEndpoint(srv)
	adminEndpoint = endpoint.MakeOAuth2AuthorizationMiddleware(config.KitLogger)(adminEndpoint)
	adminEndpoint = endpoint.MakeAuthorityAuthorizationMiddleware("Admin", config.KitLogger)(adminEndpoint)

	//创建健康检查的Endpoint
	healthEndpoint := endpoint.MakeHealthCheckEndpoint(srv)

	endpts := endpoint.OAuth2Endpoints{
		HealthCheckEndpoint: healthEndpoint,
		IndexEndpoint: indexEndpoint,
		SampleEndpoint:sampleEndpoint,
		AdminEndpoint:adminEndpoint,
	}

	//创建http.Handler
	r := transport.MakeHttpHandler(ctx, endpts, tokenService, config.KitLogger)

	go func() {
		config.Logger.Println("Http Server start at port:" + strconv.Itoa(*servicePort))
		handler := r
		errChan <- http.ListenAndServe(":"  + strconv.Itoa(*servicePort), handler)
	}()

	go func() {
		c := make(chan os.Signal, 1)
		signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
		errChan <- fmt.Errorf("%s", <-c)
	}()

	error := <-errChan
	config.Logger.Println(error)
}