using RobotNet.RobotShares.Dtos;
using RobotNet.RobotShares.VDA5050.Factsheet;
using RobotNet.RobotShares.VDA5050.FactsheetExtend;
using RobotNet.RobotShares.VDA5050.State;
using RobotNet.RobotShares.VDA5050.Visualization;
using RobotNet.Shares;

namespace RobotNet.RobotManager.Services;

public interface IRobotController
{
    string SerialNumber { get; }
    bool IsOnline { get; set; }
    bool IsWorking { get; }
    string State { get; }
    RobotOrderDto OrderState { get; }
    RobotActionDto[] ActionStates { get; }
    AutoResetEvent RobotUpdated { get; set; }
    StateMsg StateMsg { get; set; }
    VisualizationMsg VisualizationMsg { get; set; }
    FactSheetMsg FactSheetMsg { get; set; }
    FactsheetExtendMsg FactsheetExtendMsg { get; set; }
    NavigationPathEdge[] BasePath { get; }
    NavigationPathEdge[] FullPath { get; }
    string[] CurrentZones { get; }
    void Log(string message, LogLevel level = LogLevel.Information);
    Task<MessageResult<string>> InstantAction(RobotNet.RobotShares.VDA5050.InstantAction.Action action, bool waittingFisished);
    Task<MessageResult> MoveToNode(string goalName, IDictionary<string, IEnumerable<RobotShares.VDA5050.InstantAction.Action>>? actions = null, double? lastAngle = null);
    Task<MessageResult> MoveRandom(List<string> nodes);
    Task<MessageResult> CancelOrder();
    Task<MessageResult> CancelAction();
    void Initialize(double x, double y, double theta);
    MessageResult Rotate(double angle);
    MessageResult MoveStraight(double x, double y);
    void Dispose();
}
