using SC.XR.Unity.Module_InputSystem;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class AbstractDevicePartManipulation : IDevicePartManipulation
{
    protected Dictionary<InputDevicePartType, SCPointEventData> eventDataDic;
    protected Transform targetTransform;
    protected MoveLogic moveLogic;
    protected RotateLogic rotateLogic;
    protected ScaleLogic scaleLogic;
    protected ManipulationHandler manipulationHandler;

    public virtual void OneDevicePartInit(ManipulationHandler manipulationHandler, Dictionary<InputDevicePartType, SCPointEventData> eventDataDic, Transform targetTransform, MoveLogic moveLogic, RotateLogic rotateLogic, ScaleLogic scaleLogic)
    {
        this.eventDataDic = eventDataDic;
        this.targetTransform = targetTransform;
        this.moveLogic = moveLogic;
        this.rotateLogic = rotateLogic;
        this.scaleLogic = scaleLogic;
        this.manipulationHandler = manipulationHandler;
    }

    public abstract Tuple<Vector3, Quaternion, Vector3> OneDevicePartUpdate();

    public virtual void TwoDevicePartInit(ManipulationHandler manipulationHandler, Dictionary<InputDevicePartType, SCPointEventData> eventDataDic, Transform targetTransform, MoveLogic moveLogic, RotateLogic rotateLogic, ScaleLogic scaleLogic)
    {
        this.eventDataDic = eventDataDic;
        this.targetTransform = targetTransform;
        this.moveLogic = moveLogic;
        this.rotateLogic = rotateLogic;
        this.scaleLogic = scaleLogic;
        this.manipulationHandler = manipulationHandler;
    }

    public abstract Tuple<Vector3, Quaternion, Vector3> TwoDevicePartUpdate(Func<Vector3, Vector3> scaleConstraint);
}