package handlers

import (
	"bookhoard/internal/config"
	"bookhoard/internal/database"
	"bookhoard/internal/services"
	wsync "bookhoard/internal/sync"
	"context"
	"sync"
	"time"

	"github.com/labstack/echo/v5"
)

type Handler struct {
	db                *database.Queries
	scanner           *services.MediaScanner
	worker            *services.Worker
	queueProcessor    *wsync.SyncQueueProcessor
	queueCtx          context.Context
	queueCancel       context.CancelFunc
	ctx               context.Context
	cancel            context.CancelFunc
	mu                sync.Mutex
	watchModeCtx      context.Context
	watchModeCancel   context.CancelFunc
	watchingLibraries map[string]bool
	connManager       *wsync.ConnectionManager
	cleanupTaskCancel context.CancelFunc
	config            *config.Config
}

func NewHandler(db *database.Queries, connManager *wsync.ConnectionManager, queueProcessor *wsync.SyncQueueProcessor, cfg *config.Config) *Handler {
	ctx, cancel := context.WithCancel(context.Background())
	worker := services.NewWorker(3, connManager)

	queueCtx, queueCancel := context.WithCancel(context.Background())

	watchCtx, watchCancel := context.WithCancel(context.Background())

	return &Handler{
		db:                db,
		scanner:           services.NewMediaScanner(db),
		worker:            worker,
		queueProcessor:    queueProcessor,
		queueCtx:          queueCtx,
		queueCancel:       queueCancel,
		ctx:               ctx,
		cancel:            cancel,
		watchModeCtx:      watchCtx,
		watchModeCancel:   watchCancel,
		watchingLibraries: make(map[string]bool),
		connManager:       connManager,
	}
}

// parseDate parses a date string in YYYY-MM-DD format
func parseDate(dateStr string) time.Time {
	if dateStr == "" {
		return time.Time{}
	}
	if t, err := time.Parse("2006-01-02", dateStr); err == nil {
		return t
	}
	return time.Time{}
}

func SetupRoutes(g *echo.Group, db *database.Queries, connManager *wsync.ConnectionManager, queueProcessor *wsync.SyncQueueProcessor, cfg *config.Config) *Handler {
	return NewHandler(db, connManager, queueProcessor, cfg)
}
