using System.ComponentModel;
using Dabit.Mcp.Services;
using DibdProtocol.Protocol;
using Microsoft.Extensions.Logging;
using ModelContextProtocol.Server;
namespace Dabit.Mcp.Tools;
/// 컨트롤러 시각 동기화 도구. ⚠️ 쓰기.
[McpServerToolType]
public sealed class TimeTools
{
private readonly LedControlService _led;
private readonly ILogger _log;
public TimeTools(LedControlService led, ILogger log)
{
_led = led;
_log = log;
}
// 정본 SettingsViewModel: ToBcd(v) = (v/10*16)+(v%10). 26 → 0x26.
private static byte ToBcd(int v) => (byte)(v / 10 * 16 + v % 10);
private static string KoreanDow(DayOfWeek d) => d switch
{
DayOfWeek.Sunday => "일", DayOfWeek.Monday => "월", DayOfWeek.Tuesday => "화",
DayOfWeek.Wednesday => "수", DayOfWeek.Thursday => "목", DayOfWeek.Friday => "금",
_ => "토",
};
[McpServerTool]
[Description("컨트롤러의 시각(RTC)을 현재 PC 시간으로 동기화한다. ⚠️ 쓰기·설정 저장.")]
public async Task SyncControllerTime(CancellationToken ct = default)
{
var now = DateTime.Now;
// 정본 0x47: [yy(BCD), MM(BCD), dd(BCD), dow(raw 0=일~6=토), HH(BCD), mm(BCD), ss(BCD)]
byte[] payload =
{
ToBcd(now.Year % 100), ToBcd(now.Month), ToBcd(now.Day),
(byte)(int)now.DayOfWeek,
ToBcd(now.Hour), ToBcd(now.Minute), ToBcd(now.Second),
};
var resp = await _led.SendHexAsync(HexCommand.SyncTime, payload, ct, 5000);
var (ok, msg) = LedControlService.CheckWriteStatus(HexCommand.SyncTime, resp);
return ok
? $"시간 동기화 완료: {now:yyyy-MM-dd HH:mm:ss} ({KoreanDow(now.DayOfWeek)})."
: $"시간 동기화 실패 — {msg}";
}
}