using System;
using System.Collections.Generic;
using System.Drawing;
using AGVNavigationCore.Controls;
using AGVNavigationCore.PathFinding;
using AGVNavigationCore.PathFinding.Core;

namespace AGVNavigationCore.Models
{
    /// <summary>
    /// 이동 가능한 AGV 인터페이스
    /// 실제 AGV와 시뮬레이션 AGV 모두 구현해야 하는 기본 인터페이스
    /// </summary>
    public interface IMovableAGV
    {
        #region Events

        /// <summary>
        /// AGV 상태 변경 이벤트
        /// </summary>
        event EventHandler<AGVState> StateChanged;

        /// <summary>
        /// 위치 변경 이벤트
        /// </summary>
        event EventHandler<(Point, AgvDirection, MapNode)> PositionChanged;

        /// <summary>
        /// RFID 감지 이벤트
        /// </summary>
        event EventHandler<string> RfidDetected;

        /// <summary>
        /// 경로 완료 이벤트
        /// </summary>
        event EventHandler<AGVPathResult> PathCompleted;

        /// <summary>
        /// 오류 발생 이벤트
        /// </summary>
        event EventHandler<string> ErrorOccurred;

        #endregion

        #region Properties

        /// <summary>
        /// AGV ID
        /// </summary>
        string AgvId { get; }

        /// <summary>
        /// 현재 위치
        /// </summary>
        Point CurrentPosition { get; set; }

        /// <summary>
        /// 현재 방향 (모터 방향)
        /// </summary>
        AgvDirection CurrentDirection { get; set; }

        /// <summary>
        /// 현재 상태
        /// </summary>
        AGVState CurrentState { get; set; }

        /// <summary>
        /// 현재 속도
        /// </summary>
        float CurrentSpeed { get; }

        /// <summary>
        /// 배터리 레벨 (0-100%)
        /// </summary>
        float BatteryLevel { get; set; }

        /// <summary>
        /// 현재 경로
        /// </summary>
        AGVPathResult CurrentPath { get; }

        /// <summary>
        /// 현재 노드 ID
        /// </summary>
        MapNode CurrentNode { get; }

        /// <summary>
        /// 목표 위치
        /// </summary>
        Point? PrevPosition { get; }

        /// <summary>
        /// 목표 노드 ID
        /// </summary>
        MapNode PrevNode { get; }

        /// <summary>
        /// 도킹 방향
        /// </summary>
        DockingDirection DockingDirection { get; }

        #endregion

        #region Sensor Input Methods (실제 AGV에서 호출)

        /// <summary>
        /// 현재 위치 설정 (실제 위치 센서에서)
        /// </summary>
        void SetCurrentPosition(Point position);

        /// <summary>
        /// 감지된 RFID 설정 (실제 RFID 센서에서)
        /// </summary>
        void SetDetectedRfid(string rfidId);

        /// <summary>
        /// 모터 방향 설정 (모터 컨트롤러에서)
        /// </summary>
        void SetMotorDirection(AgvDirection direction);

        /// <summary>
        /// 배터리 레벨 설정 (BMS에서)
        /// </summary>
        void SetBatteryLevel(float percentage);

        #endregion

        #region State Query Methods

        /// <summary>
        /// 현재 위치 조회
        /// </summary>
        Point GetCurrentPosition();

        /// <summary>
        /// 현재 상태 조회
        /// </summary>
        AGVState GetCurrentState();

        /// <summary>
        /// 현재 노드 ID 조회
        /// </summary>
        MapNode GetCurrentNode();

        /// <summary>
        /// AGV 상태 정보 문자열 조회
        /// </summary>
        string GetStatus();

        #endregion

        #region Path Execution Methods

        /// <summary>
        /// 경로 정지
        /// </summary>
        void StopPath();

        /// <summary>
        /// 긴급 정지
        /// </summary>
        void EmergencyStop();

        #endregion

        #region Update Method

        /// <summary>
        /// 프레임 업데이트 (외부에서 주기적으로 호출)
        /// 이 방식으로 타이머에 의존하지 않고 외부에서 제어 가능
        /// </summary>
        /// <param name="deltaTimeMs">마지막 업데이트 이후 경과 시간 (밀리초)</param>
        void Update(float deltaTimeMs);

        #endregion

        #region Manual Control Methods (테스트용)

        /// <summary>
        /// 수동 이동
        /// </summary>
        void MoveTo(Point targetPosition);

        /// <summary>
        /// 수동 회전
        /// </summary>
        void Rotate(AgvDirection direction);

        /// <summary>
        /// 충전 시작
        /// </summary>
        void StartCharging();

        /// <summary>
        /// 충전 종료
        /// </summary>
        void StopCharging();

        #endregion

        #region Cleanup

        /// <summary>
        /// 리소스 정리
        /// </summary>
        void Dispose();

        #endregion
    }
}
