package tgbot

import (
	"fmt"
	"log/slog"
	"strings"

	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)

// SetLibraryLogger направляет внутренние логи клиента tgbotapi в наш slog.
//
// Зачем: библиотека логирует сбои long-poll `getUpdates` через собственный
// (stdlib `log`) логгер — МИМО slog. Из-за этого сетевые/API-ошибки поллинга не
// попадали в структурированные JSON-логи: входящее сообщение молча не
// подхватывалось, а в логах — пусто (см. logging.md). После вызова такие сбои
// видны как `telegram library` (WARN).
//
// Токен вырезается из текста: строка ошибки транспорта — `*url.Error` с URL вида
// `…/bot<TOKEN>/getUpdates`, писать её как есть нельзя (утечка секрета в логи).
// Замена по подстроке страхует и от прочих мест, где токен мог бы просочиться.
//
// Логгер в tgbotapi — глобальный на пакет; вызывать один раз при старте.
func SetLibraryLogger(log *slog.Logger, token string) error {
	return tgbotapi.SetLogger(libLogger{log: log, token: token})
}

type libLogger struct {
	log   *slog.Logger
	token string
}

func (l libLogger) Println(v ...any) { l.emit(fmt.Sprintln(v...)) }

func (l libLogger) Printf(format string, v ...any) { l.emit(fmt.Sprintf(format, v...)) }

func (l libLogger) emit(msg string) {
	msg = strings.TrimSpace(msg)
	if l.token != "" {
		msg = strings.ReplaceAll(msg, l.token, "***")
	}
	// Сбои поллинга транзиентны (библиотека повторяет через 3 с) — WARN
	// («retry внешнего вызова»); устойчивый сбой станет потоком WARN — сигнал
	// разбираться, но не ERROR на каждый повтор.
	l.log.Warn("telegram library", "detail", msg)
}
