package app

import (
	"context"

	"{{.Modules.logger.Import}}"
)

{{.Modules.env.Struct}}

func Run(ctx context.Context, config Config, logger {{.Modules.logger.Type}}) error {
    defer func() {
    		if r := recover(); r != nil {
    			logger.Error("Recovered from a panic", zap.Any("error", r))
    		}
    	}()

	{{.Modules.logger.Message "info" "App started" "config" "config"}}

	 ctx, cancel := context.WithCancel(ctx)
     defer cancel()

    // Инициализация репозиториев
    {{range $key, $value := .LayersData.Repositories}}
    {{$key}}Repository := {{$value.PackageName}}.New{{$value.Name}}Repository()
    {{end}}

    // Инициализация сервисов
    {{range $key, $value := .LayersData.Services}}
    {{$key}}Service := {{$value.PackageName}}.New{{$value.Name}}Service({{$key}}Repository)
    {{end}}

    // Инициализация контроллеров
    {{range $key, $value := .LayersData.Controllers}}
    {{$key}}Controller := {{$value.PackageName}}.New{{$value.Name}}Controller({{$key}}Service)
    {{end}}

// Создание сервера
    server := {{.LayersData.ServerData}}.NewServer({{.LayersData.ServerData}}.ServerConfig{
        Controllers: []{{.LayersData.ServerData}}.Controller{
            {{range $key, $value := .LayersData.Controllers}}
            {{$key}}Controller,
            {{end}}
        },
    })

    go func() {
        err := server.Start("Host + : + Port")
        if err != nil {
            logger.Error("Server startup error", zap.Error(err))
            cancel()
        }
    }()

    // Вывод маршрутов
    server.ListRoutes()

	<-ctx.Done()

	logger.Info("App shutting down gracefully")

    //TODO
	// Остановка сервера


	return nil
}