package config

import (
	"os"
	"time"

	klog "github.com/sirupsen/logrus"
	"github.com/spf13/viper"
)

// startConfigFileWatcher 启动配置文件轮询监听
func startConfigFileWatcher(configFile string, v *viper.Viper) {
	if configFile == "" {
		klog.Warnf("⚠️  [CONFIG] ConfigFileUsed() returned empty string, cannot start polling watcher")
		return
	}

	klog.Infof("✓ [CONFIG] Starting polling watcher for: %s", configFile)
	go func() {
		lastModTime := time.Now()
		// 初始化时获取文件的修改时间
		if info, err := os.Stat(configFile); err == nil {
			lastModTime = info.ModTime()
			klog.Infof("✓ [CONFIG] Initial file modTime: %v", lastModTime)
		}

		ticker := time.NewTicker(1 * time.Second)
		defer ticker.Stop()

		for {
			select {
			case <-ticker.C:
				info, err := os.Stat(configFile)
				if err != nil {
					// 文件不存在或无法访问，跳过本次检查
					klog.Debugf("⏭️  [CONFIG] Cannot stat config file: %v", err)
					continue
				}

				// 检查文件修改时间是否变化
				if info.ModTime().After(lastModTime) {
					lastModTime = info.ModTime()
					klog.Infof("🔔 [CONFIG] Config file changed detected by polling: %s (modTime: %v)", configFile, lastModTime)

					configMutex.Lock()
					// 重新加载配置
					if err := v.ReadInConfig(); err != nil {
						klog.Errorf("❌ [CONFIG] Error reloading config file: %v", err)
						configMutex.Unlock()
						continue
					}

					// 重新加载 Config 管理器
					cfg := Get()
					cfg.Reload()

					// 应用配置变更
					applyConfig(v, true)
					configMutex.Unlock()
				}
			}
		}
	}()
}

// watchCommonIni 使用轮询方式监控 common.ini 文件变化
// 注意：RunInOmniagent 是启动时确定的标志，不支持热更新
// 只有在启动时 RunInOmniagent 为 true 时，才会启动此监控
func watchCommonIni(iniPath string) {
	klog.Infof("✓ [CONFIG] Starting polling watcher for common.ini: %s", iniPath)
	go func() {
		lastModTime := time.Now()
		// 初始化时获取文件的修改时间
		if info, err := os.Stat(iniPath); err == nil {
			lastModTime = info.ModTime()
			klog.Infof("✓ [CONFIG] Initial common.ini modTime: %v", lastModTime)
		}

		ticker := time.NewTicker(1 * time.Second)
		defer ticker.Stop()

		for {
			select {
			case <-ticker.C:
				info, err := os.Stat(iniPath)
				if err != nil {
					// 文件不存在或无法访问，跳过本次检查
					klog.Debugf("⏭️  [CONFIG] Cannot stat common.ini file: %v", err)
					continue
				}

				// 检查文件修改时间是否变化
				if info.ModTime().After(lastModTime) {
					lastModTime = info.ModTime()
					klog.Infof("🔔 [CONFIG] common.ini file changed detected by polling: %s (modTime: %v)", iniPath, lastModTime)

					configMutex.Lock()
					loadConfigFromCommonIni()
					configMutex.Unlock()
				}
			}
		}
	}()
}
