using System;
using System.Collections.Generic;
using System.Drawing;
using AGVNavigationCore.Controls;
using AGVNavigationCore.PathFinding;
using AGVNavigationCore.PathFinding.Core;
namespace AGVNavigationCore.Models
{
///
/// 이동 가능한 AGV 인터페이스
/// 실제 AGV와 시뮬레이션 AGV 모두 구현해야 하는 기본 인터페이스
///
public interface IMovableAGV
{
#region Events
///
/// AGV 상태 변경 이벤트
///
event EventHandler StateChanged;
///
/// 위치 변경 이벤트
///
event EventHandler<(Point, AgvDirection, MapNode)> PositionChanged;
///
/// RFID 감지 이벤트
///
event EventHandler RfidDetected;
///
/// 경로 완료 이벤트
///
event EventHandler PathCompleted;
///
/// 오류 발생 이벤트
///
event EventHandler ErrorOccurred;
#endregion
#region Properties
///
/// AGV ID
///
string AgvId { get; }
///
/// 현재 위치
///
Point CurrentPosition { get; set; }
///
/// 현재 방향 (모터 방향)
///
AgvDirection CurrentDirection { get; set; }
///
/// 현재 상태
///
AGVState CurrentState { get; set; }
///
/// 현재 속도
///
float CurrentSpeed { get; }
///
/// 배터리 레벨 (0-100%)
///
float BatteryLevel { get; set; }
///
/// 현재 경로
///
AGVPathResult CurrentPath { get; }
///
/// 현재 노드 ID
///
MapNode CurrentNode { get; }
///
/// 목표 위치
///
Point? PrevPosition { get; }
///
/// 목표 노드 ID
///
MapNode PrevNode { get; }
///
/// 도킹 방향
///
DockingDirection DockingDirection { get; }
#endregion
#region Sensor Input Methods (실제 AGV에서 호출)
///
/// 현재 위치 설정 (실제 위치 센서에서)
///
void SetCurrentPosition(Point position);
///
/// 감지된 RFID 설정 (실제 RFID 센서에서)
///
void SetDetectedRfid(string rfidId);
///
/// 모터 방향 설정 (모터 컨트롤러에서)
///
void SetMotorDirection(AgvDirection direction);
///
/// 배터리 레벨 설정 (BMS에서)
///
void SetBatteryLevel(float percentage);
#endregion
#region State Query Methods
///
/// 현재 위치 조회
///
Point GetCurrentPosition();
///
/// 현재 상태 조회
///
AGVState GetCurrentState();
///
/// 현재 노드 ID 조회
///
MapNode GetCurrentNode();
///
/// AGV 상태 정보 문자열 조회
///
string GetStatus();
#endregion
#region Path Execution Methods
///
/// 경로 정지
///
void StopPath();
///
/// 긴급 정지
///
void EmergencyStop();
#endregion
#region Update Method
///
/// 프레임 업데이트 (외부에서 주기적으로 호출)
/// 이 방식으로 타이머에 의존하지 않고 외부에서 제어 가능
///
/// 마지막 업데이트 이후 경과 시간 (밀리초)
void Update(float deltaTimeMs);
#endregion
#region Manual Control Methods (테스트용)
///
/// 수동 이동
///
void MoveTo(Point targetPosition);
///
/// 수동 회전
///
void Rotate(AgvDirection direction);
///
/// 충전 시작
///
void StartCharging();
///
/// 충전 종료
///
void StopCharging();
#endregion
#region Cleanup
///
/// 리소스 정리
///
void Dispose();
#endregion
}
}