using System;
using JXHelper.Config;
using JXHelper.Platform;
namespace JXHelper.Core;
///
/// Đại diện cho một phiên điều khiển tab game độc lập (INV-FSM-SINGLE-OWNER).
/// Mỗi tab game có một BotBrain, BotConfig và trạng thái riêng biệt.
///
public class BotSession
{
public GameWindowInfo WindowInfo { get; set; }
public BotConfig Config { get; set; }
public BotBrain Brain { get; }
public bool IsChecked { get; set; } = true;
public string StatusText { get; set; } = "Đang chờ";
public TimeSpan RemainingTime { get; set; } = TimeSpan.Zero;
public bool IsRunning => Brain.CurrentState != BotState.Idle;
public string CharacterName => !string.IsNullOrEmpty(Config.CharacterName) ? Config.CharacterName : WindowInfo.CharacterName;
public event Action? OnStateUpdated;
public event Action? OnLogReceived;
public BotSession(GameWindowInfo windowInfo, BotConfig config)
{
WindowInfo = windowInfo;
Config = config;
Brain = new BotBrain();
Brain.OnStateChanged += state =>
{
StatusText = state switch
{
BotState.Idle => "Dừng",
BotState.Running => "Luyện công",
BotState.ReturningToTown => "Về thành",
BotState.WaitingMapLoad => "Nạp map",
BotState.OpeningBag => "Mở rương",
BotState.ClickingRepairItem => "Sửa đồ",
BotState.ClosingBag => "Đóng rương",
BotState.FinishedCycle => "Xong chu kỳ",
BotState.Paused => "Tạm dừng",
BotState.Error => "Lỗi",
_ => state.ToString()
};
OnStateUpdated?.Invoke(this);
};
Brain.OnCountdownTick += remaining =>
{
RemainingTime = remaining;
OnStateUpdated?.Invoke(this);
};
Brain.OnLog += msg =>
{
OnLogReceived?.Invoke(this, msg);
};
}
public void Start()
{
WindowManager.RestoreIfMinimized(WindowInfo.Handle);
Brain.Start(WindowInfo.Handle, Config);
}
public void Stop()
{
Brain.Stop();
StatusText = "Dừng";
RemainingTime = TimeSpan.Zero;
OnStateUpdated?.Invoke(this);
}
}