package main

import (
    "context"
    "fmt"
    "time"
    "github.com/gin-gonic/gin"
    "go.uber.org/zap"
)

// {{.ServiceName}}Service gère les fonctionnalités de {{.ServiceName}}
type {{.ServiceName}}Service struct {
    logger *zap.Logger
    // Ajoutez vos dépendances ici
}

// New{{.ServiceName}}Service crée une nouvelle instance du service
func New{{.ServiceName}}Service(logger *zap.Logger) *{{.ServiceName}}Service {
    return &{{.ServiceName}}Service{
        logger: logger,
    }
}

// Exemple de méthode - remplacez par vos méthodes
func (s *{{.ServiceName}}Service) Process{{.ServiceName}}(ctx context.Context, input string) (string, error) {
    s.logger.Info("Processing {{.ServiceName}}", zap.String("input", input))
    
    // Implémentation de votre logique métier
    result := fmt.Sprintf("Processed: %s", input)
    
    s.logger.Info("{{.ServiceName}} processed successfully", zap.String("result", result))
    return result, nil
}

// Health check pour le service
func (s *{{.ServiceName}}Service) HealthCheck() error {
    s.logger.Debug("{{.ServiceName}} health check")
    // Implémentation du health check
    return nil
}

// {{.ServiceName}}Handler gère les endpoints HTTP pour {{.ServiceName}}
type {{.ServiceName}}Handler struct {
    service *{{.ServiceName}}Service
    logger  *zap.Logger
}

// New{{.ServiceName}}Handler crée un nouveau handler
func New{{.ServiceName}}Handler(service *{{.ServiceName}}Service, logger *zap.Logger) *{{.ServiceName}}Handler {
    return &{{.ServiceName}}Handler{
        service: service,
        logger:  logger,
    }
}

// SetupRoutes configure les routes pour ce service
func (h *{{.ServiceName}}Handler) SetupRoutes(r *gin.RouterGroup) {
    r.GET("/{{.ServiceName}}", h.Get{{.ServiceName}})
    r.POST("/{{.ServiceName}}", h.Create{{.ServiceName}})
    r.PUT("/{{.ServiceName}}/:id", h.Update{{.ServiceName}})
    r.DELETE("/{{.ServiceName}}/:id", h.Delete{{.ServiceName}})
}

// Get{{.ServiceName}} récupère les données de {{.ServiceName}}
func (h *{{.ServiceName}}Handler) Get{{.ServiceName}}(c *gin.Context) {
    h.logger.Info("Get {{.ServiceName}} request")
    
    // Implémentation
    c.JSON(200, gin.H{
        "message": "Get {{.ServiceName}} endpoint",
        "timestamp": time.Now(),
    })
}

// Create{{.ServiceName}} crée une nouvelle entrée
func (h *{{.ServiceName}}Handler) Create{{.ServiceName}}(c *gin.Context) {
    h.logger.Info("Create {{.ServiceName}} request")
    
    // Implémentation
    c.JSON(201, gin.H{
        "message": "Create {{.ServiceName}} endpoint",
        "timestamp": time.Now(),
    })
}

// Update{{.ServiceName}} met à jour une entrée existante
func (h *{{.ServiceName}}Handler) Update{{.ServiceName}}(c *gin.Context) {
    h.logger.Info("Update {{.ServiceName}} request")
    
    // Implémentation
    c.JSON(200, gin.H{
        "message": "Update {{.ServiceName}} endpoint",
        "timestamp": time.Now(),
    })
}

// Delete{{.ServiceName}} supprime une entrée
func (h *{{.ServiceName}}Handler) Delete{{.ServiceName}}(c *gin.Context) {
    h.logger.Info("Delete {{.ServiceName}} request")
    
    // Implémentation
    c.JSON(200, gin.H{
        "message": "Delete {{.ServiceName}} endpoint",
        "timestamp": time.Now(),
    })
}
