package service

import (
	"log/slog"
	"time"

	"github.com/tidbcloud/aisupport/services/oncall/db"
	"github.com/tidbcloud/aisupport/services/oncall/models"
)

const phoneSyncInterval = 6 * time.Hour

func SyncEngineerPhones() {
	var engineers []models.Engineer
	if err := db.DB.Find(&engineers).Error; err != nil {
		slog.Error("phone sync: failed to list engineers", "error", err)
		return
	}

	var updated, failed int
	for _, eng := range engineers {
		if eng.Email == "" {
			continue
		}
		profile, err := FetchFeishuUserProfile(eng.Email)
		if err != nil {
			slog.Warn("phone sync: fetch profile failed", "email", eng.Email, "error", err)
			failed++
			continue
		}

		updates := map[string]interface{}{}
		if profile.Phone != "" && profile.Phone != eng.Phone {
			updates["phone"] = profile.Phone
		}
		if profile.Name != "" && profile.Name != eng.Name {
			updates["name"] = profile.Name
		}
		if profile.EnName != "" && profile.EnName != eng.EnName {
			updates["en_name"] = profile.EnName
		}
		if len(updates) == 0 {
			continue
		}

		if err := db.DB.Model(&eng).Updates(updates).Error; err != nil {
			slog.Error("phone sync: update failed", "email", eng.Email, "error", err)
			failed++
			continue
		}
		slog.Info("phone sync: updated engineer", "email", eng.Email, "fields", updates)
		updated++
	}

	slog.Info("phone sync: done", "total", len(engineers), "updated", updated, "failed", failed)
}

func StartPhoneSyncLoop() {
	slog.Info("phone sync loop started", "interval", phoneSyncInterval.String())
	SyncEngineerPhones()
	ticker := time.NewTicker(phoneSyncInterval)
	defer ticker.Stop()
	for range ticker.C {
		SyncEngineerPhones()
	}
}
