package main

import "fmt"

// Plugin defines a simple notification interface.
type Plugin interface {
    Notify(event string, payload interface{})
}

// TelegramNotifier is a mock notifier that would send a Telegram message in a real deployment.
type TelegramNotifier struct{}

func (t *TelegramNotifier) Notify(event string, payload interface{}) {
    fmt.Printf("[TelegramNotifier] event=%s payload=%v\n", event, payload)
}

// SlackNotifier is a mock notifier that would send a Slack message in a real deployment.
type SlackNotifier struct{}

func (s *SlackNotifier) Notify(event string, payload interface{}) {
    fmt.Printf("[SlackNotifier] event=%s payload=%v\n", event, payload)
}

// TrafficLogger logs traffic-related events for debugging/observability.
type TrafficLogger struct{}

func (l *TrafficLogger) Notify(event string, payload interface{}) {
    fmt.Printf("[TrafficLogger] event=%s payload=%v\n", event, payload)
}

// PluginManager loads and triggers plugins.
type PluginManager struct {
    plugins []Plugin
}

// NewPluginManager creates a new PluginManager instance.
func NewPluginManager() *PluginManager {
    return &PluginManager{plugins: []Plugin{}}
}

// LoadPlugins initializes the built-in example plugins.
func (pm *PluginManager) LoadPlugins() {
    pm.plugins = []Plugin{
        &TelegramNotifier{},
        &SlackNotifier{},
        &TrafficLogger{},
    }
}

// Trigger dispatches an event to all registered plugins.
func (pm *PluginManager) Trigger(event string, payload interface{}) {
    for _, p := range pm.plugins {
        p.Notify(event, payload)
    }
}
