package main

import (
	"context"
	"os/signal"
	"syscall"

	"github.com/TrueCloudLab/frostfs-rest-gw/gen/restapi"
	"github.com/TrueCloudLab/frostfs-rest-gw/gen/restapi/operations"
	"github.com/go-openapi/loads"
	"go.uber.org/zap"
)

func main() {
	ctx, _ := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)

	v := config()
	logger := newLogger(v)
	validateConfig(v, logger)

	neofsAPI, err := newNeofsAPI(ctx, logger, v)
	if err != nil {
		logger.Fatal("init neofs", zap.Error(err))
	}

	swaggerSpec, err := loads.Analyzed(restapi.SwaggerJSON, "")
	if err != nil {
		logger.Fatal("init spec", zap.Error(err))
	}

	serverCfg := serverConfig(v)
	serverCfg.SuccessfulStartCallback = neofsAPI.StartCallback

	api := operations.NewFrostfsRestGwAPI(swaggerSpec)
	server := restapi.NewServer(api, serverCfg)
	defer func() {
		if err = server.Shutdown(); err != nil {
			logger.Error("shutdown", zap.Error(err))
		}
	}()

	server.ConfigureAPI(neofsAPI.Configure)
	neofsAPI.RunServices()

	// serve API
	if err = server.Serve(); err != nil {
		logger.Fatal("serve", zap.Error(err))
	}
}