// package serv_web -- сервер бота на файбере
package serv_web

import (
	"fmt"
	"log"
	"os"
	"sync"
	"time"

	"github.com/gofiber/fiber/v2"
	// "github.com/gofiber/template/html"

	"wartank/server/serv_web/web_api"

	"wartank/pkg/types"
)

/*
	Главный тип бота на файбере
*/

// ServWeb -- главный тип приложения
type ServWeb struct {
	app    types.IServer
	api    *web_api.WebApi
	router *fiber.App
	block  *sync.RWMutex
	port   string // Порт веб-сервера
}

// NewServWeb -- возвращае тновый *ServFiber
func NewServWeb(app types.IServer) (serv *ServWeb, err error) {
	fmt.Printf("NewServWeb()\n")
	if app == nil {
		return nil, fmt.Errorf("NewServWeb(): IApp is nil")
	}
	port := os.Getenv("SERVER_PORT")
	if port == "" {
		return nil, fmt.Errorf("NewServWeb(): env SERVER_PORT not set")
	}
	sf := &ServWeb{
		app:   app,
		block: &sync.RWMutex{},
		port:  port,
	}
	// engine := html.New("./static/tmpl", "*.tmpl.html")
	fiberConfig := fiber.Config{
		ServerHeader:    "WarTank",
		BodyLimit:       10 * 1024 * 1024,
		Concurrency:     512,
		ReadTimeout:     30 * time.Second,
		WriteTimeout:    30 * time.Second,
		IdleTimeout:     30 * time.Second,
		ReadBufferSize:  20 * 1024,
		WriteBufferSize: 20 * 1024,
		AppName:         "WarTank",
		Network:         fiber.NetworkTCP4,
		// Views:           engine,
	}
	sf.router = fiber.New(fiberConfig)
	// sf.router.Static("/static", "./static")
	return sf, nil
}

// Run -- запускает бота в работу
func (sf *ServWeb) Run() error {
	log.Printf("ServWeb.Run()\n")
	var err error
	{
		sf.api, err = web_api.NewWebApi(sf.app)
		if err != nil {
			return fmt.Errorf("ServWeb.Run(): in make WebApi, err=\n\t%w", err)
		}
	}

	sf.api.Run()
	log.Printf("ServWeb.Run(): listen\n")
	if err := sf.router.Listen(":" + sf.port); err != nil {
		panic(fmt.Errorf("ServWeb.Run(): in serving web, err=\n\t%w", err))
	}
	return nil
}

// Router -- возвращает роутер сервера
func (sf *ServWeb) Router() *fiber.App {
	return sf.router
}
