package services

import (
	"context"
	"encoding/json"

	"go.uber.org/zap"
)

// JobService gère les jobs en arrière-plan
type JobService struct {
	logger *zap.Logger
	// TODO: Intégrer asynq ou autre système de queue
}

// Job types
const (
	TypeEmailSend         = "email:send"
	TypeThumbnailGenerate = "thumbnail:generate"
	TypeAnalyticsProcess  = "analytics:process"
	TypeWebhookDelivery   = "webhook:delivery"
)

// EmailPayload représente les données pour l'envoi d'email
type EmailPayload struct {
	To      string
	Subject string
	Body    string
}

// ThumbnailPayload représente les données pour la génération de miniatures
type ThumbnailPayload struct {
	TrackID  uint
	FileID   string
	FilePath string
}

// NewJobService crée un nouveau service de jobs
func NewJobService(logger *zap.Logger) *JobService {
	return &JobService{
		logger: logger,
	}
}

// EnqueueEmail enfile un job d'envoi d'email
func (s *JobService) EnqueueEmail(ctx context.Context, payload *EmailPayload) error {
	s.logger.Info("Email job enqueued",
		zap.String("to", payload.To),
		zap.String("subject", payload.Subject))

	// TODO: Intégrer queue système (asynq, RabbitMQ, etc.)
	return nil
}

// EnqueueThumbnail enfile un job de génération de miniature
func (s *JobService) EnqueueThumbnail(ctx context.Context, payload *ThumbnailPayload) error {
	s.logger.Info("Thumbnail job enqueued",
		zap.Uint("track_id", payload.TrackID))

	// TODO: Intégrer queue système
	return nil
}

// Helper functions

func toJSON(v interface{}) []byte {
	data, err := json.Marshal(v)
	if err != nil {
		return nil
	}
	return data
}

func fromJSON(data []byte, v interface{}) error {
	return json.Unmarshal(data, v)
}
