package application

import (
	"fmt"
	"net"
	"net/http"

	"github.com/tiburon-777/OTUS_Project/internal/cache"
	"github.com/tiburon-777/OTUS_Project/internal/config"
	"github.com/tiburon-777/OTUS_Project/internal/logger"
)

type App struct {
	*http.Server
	Log   logger.Interface
	Cache cache.Cache
	Conf  config.Config
}

func New(conf config.Config) (*App, error) {
	loger, err := logger.New(conf.Log)
	if err != nil {
		return nil, fmt.Errorf("can't start logger:\n %w", err)
	}
	c, err := cache.NewCache(conf.Cache.Capacity, conf.Cache.StoragePath)
	if err != nil {
		return nil, fmt.Errorf("can't start cache:\n %w", err)
	}
	return &App{Server: &http.Server{Addr: net.JoinHostPort(conf.Server.Address, conf.Server.Port)}, Log: loger, Cache: c, Conf: conf}, nil
}

func (s *App) Start() error {
	s.Log.Infof("Server starting")
	s.Handler = loggingMiddleware(handler(s.Cache, s.Conf, s.Log), s.Log)
	err := s.ListenAndServe()
	s.Log.Infof("Server stoped")
	return err
}

func (s *App) Stop() error {
	if err := s.Close(); err != nil {
		return err
	}
	return nil
}