using VOID.Generic.Objects.Abstract;
using VOID.Generic.Objects.Unit.Actions.Exceptions;
using VOID.Generic.Objects.Unit.Events;
using VOID.Generic.Util;

namespace VOID.Generic.Objects.Unit.Actions
{
    public class TalkAction : AbstractAction
    {
        private readonly UnitObject _unit;
        private readonly UnitObject _targetObject;

        public TalkAction(UnitObject unit, UnitObject targetObject)
        {
            _unit = unit;
            _targetObject = targetObject;
        }

        public override bool IsInRange()
        {
            return RangeUtil.IsInRange(_unit, _targetObject, _unit.unitData.talkRange);
        }

        protected override void OnEndIt() { }

        protected override void OnCancelIt() { }
        
        public override void CanDoIt()
        {
            Check(
                _unit.unitData.canTalk,
                UnitActionErrorType.ThisUnitCantTalk);
            Check(
                _targetObject.unitData.canBeTalked,
                UnitActionErrorType.OtherUnitCantBeTalked);
            Check(
                state == ActionState.Ready,
                UnitActionErrorType.ActionStateIsNotReady);
            Check(
                !_unit.basicState.turnManager,
                UnitActionErrorType.TalkNotAvailableWhenTurnActive);
            Check(
                _unit.unitState.isControllable,
                UnitActionErrorType.UnitStateIsNotControllable);
            Check(
                _unit.unitState.isControllable,
                UnitActionErrorType.UnitStateIsNotControllable);
            Check(
                IsInRange(),
                UnitActionErrorType.NotInRange);
        }

        protected override void OnDoIt()
        {
            new RotateAction(_unit, _targetObject).DoIt();
            BeforePerform();
            // Tutaj rozmowa
            AfterPerform();
            EndIt();
        }
    }
}