from enum import Enum
from win32com.client import CDispatch
from IFikomObject import IFikomObject
from IParametre import IParametre
from IReferans import IReferans
from IYardimciSiniflar import XYZ


class EksenTipi(Enum):
    StandartEksen = 0
    DondurulmusEksen = 1
    EularEksen = 2
    BagimsizEksen = 3


class EksenYonTipi(Enum):
    ObjeYonu = 0
    VektorYonu = 1
    KarsiYon = 2


class IEksen(IFikomObject):
    def __init__(self, obj:CDispatch, sahip:IFikomObject=None):
        super(IEksen, self).__init__(obj, sahip)
        self.sahip = sahip
        self.tipi = "IEksen"

    @property
    def ismi(self) -> str:
        return self.catNesne.Name

    @ismi.setter
    def ismi(self, value:str):
        self.catNesne.Name = value

    @property
    def eksenDondurmeAcisi(self) -> IParametre:
        return IParametre(obj=self.catNesne.AxisRotationAngle)

    @eksenDondurmeAcisi.setter
    def eksenDondurmeAcisi(self, value):
        __value = value
        if isinstance(value, str):
            if not "deg" in value:
                __value = value + ("deg")
        if isinstance(value, float) or isinstance(value, int):
            __value = str(value) + "deg"
        if isinstance(value, IParametre):
            __value = value.degeriStr
        IParametre(self.catNesne.AxisRotationAngle).degeriStr = __value

    @property
    def eksenDondurmeReferansi(self) -> IReferans:
        return IReferans(obj=self.catNesne.AxisRotationReference)

    @eksenDondurmeReferansi.setter
    def eksenDondurmeReferansi(self, value:IReferans):
        self.catNesne.AxisRotationReference = value.catNesne

    @property
    def gecerliEksen(self) -> bool:
        return self.catNesne.IsCurrent

    @gecerliEksen.setter
    def gecerliEksen(self, value:bool):
        self.catNesne.IsCurrent = value

    @property
    def merkezNoktasi(self) -> IReferans:
        return IReferans(obj=self.catNesne.OriginPoint)

    @merkezNoktasi.setter
    def merkezNoktasi(self, value:IReferans):
        self.catNesne.OriginPoint = value.catNesne

    @property
    def eksenTipi(self) -> EksenTipi:
        return EksenTipi(self.catNesne.Type)

    @eksenTipi.setter
    def eksenTipi(self, value:EksenTipi):
        self.catNesne.Type = value

    @property
    def xYonu(self) -> IReferans:
        return IReferans(obj=self.catNesne.XAxisDirection)

    @xYonu.setter
    def xYonu(self, value:IReferans):
        self.catNesne.XAxisDirection = value.catNesne

    @property
    def yYonu(self) -> IReferans:
        return IReferans(obj=self.catNesne.YAxisDirection)

    @yYonu.setter
    def yYonu(self, value:IReferans):
        self.catNesne.YAxisDirection = value.catNesne

    @property
    def zYonu(self) -> IReferans:
        return IReferans(obj=self.catNesne.ZAxisDirection)

    @zYonu.setter
    def zYonu(self, value:IReferans):
        self.catNesne.ZAxisDirection = value.catNesne

    @property
    def xYonTipi(self) -> EksenYonTipi:
        return EksenYonTipi(self.catNesne.XAxisType)

    @xYonTipi.setter
    def xYonTipi(self, value:EksenYonTipi):
        self.catNesne.XAxisType = value

    @property
    def yYonTipi(self) -> EksenYonTipi:
        return EksenYonTipi(self.catNesne.YAxisType)

    @yYonTipi.setter
    def yYonTipi(self, value:EksenYonTipi):
        self.catNesne.YAxisType = value

    @property
    def zYonTipi(self) -> EksenYonTipi:
        return EksenYonTipi(self.catNesne.ZAxisType)

    @zYonTipi.setter
    def zYonTipi(self, value:EksenYonTipi):
        self.catNesne.ZAxisType = value

    @property
    def eularAcilari(self):
        evalCode = """
			Dim dirc(2) As Double
			Eksen.GetEulerAngles dirc(0), dirc(1), dirc(2)
			return = dirc
		"""
        rslt = self.anaProgram.eval(evalCode, "Eksen", [self.catNesne])
        # self.catNesne.GetEulerAngles(aci1, aci2, aci3)
        # rslt = [IParametre(aci1), IParametre(aci2), IParametre(aci3)]
        _rslt=IParametre(rslt[0]), IParametre(rslt[1]), IParametre(rslt[2])
        return _rslt

    @property
    def merkez(self)->XYZ:
        evalCode = """
			Dim dirc(2) as Double
			Eksen.GetOrigin dirc
			return = dirc
		"""
        rslt = self.anaProgram.eval(evalCode, "Eksen", [self.catNesne])
        return XYZ(X=rslt[0], Y=rslt[1], Z=rslt[2])

    @merkez.setter
    def merkez(self, value):
        evalCode = """
			Dim dirc(2) as Double
			dirc(0) = X
			dirc(1) = Y
			dirc(2) = Z
			Eksen.PutOrigin dirc
			return = dirc
		"""
        if isinstance(value, XYZ):
            _X=value.X
            _Y=value.Y
            _Z=value.Z

        if isinstance(value, list):
            _X=value[0]
            _Y=value[1]
            _Z=value[2]

        self.anaProgram.eval(evalCode, "Eksen,X,Y,Z", [self.catNesne,_X,_Y,_Z])

    @property
    def vektorXY(self)->list:
        evalCode = """
			Dim Xvektor(2) as Double
			Dim Yvektor(2) as Double
			Eksen.GetVectors Xvektor,Yvektor

			dim rslt(5) as Double
			rslt(0)=Xvektor(0)
			rslt(1)=Xvektor(1)
			rslt(2)=Xvektor(2)

			rslt(3)=Yvektor(0)
			rslt(4)=Yvektor(1)
			rslt(5)=Yvektor(2)

			return = rslt
		"""
        rslt = self.anaProgram.eval(evalCode, "Eksen", [self.catNesne])
        return rslt

    @vektorXY.setter
    def vektorXY(self, value):
        # TODO Hata VaR
        evalCode = """
			Dim X(2) as Double
			Dim Y(2) as Double

			X(0)=X1
			X(1)=X2
			X(2)=X3

			Y(0)=Y1
			Y(1)=Y2
			Y(2)=Y3
			Eksen.PutVectors X,Y
			return = ""
		"""
        self.anaProgram.eval(evalCode, "Eksen ,X1,X2,X3, Y1,Y2,Y3", [self.catNesne, value[0],value[1],value[2],value[3],value[4],value[5]])


    @property
    def x(self)->XYZ:
        evalCode = """
			Dim dirc(2) as Double
			Eksen.GetXAxis dirc
			return = dirc
		"""
        rslt = self.anaProgram.eval(evalCode, "Eksen", [self.catNesne])
        return XYZ(X=rslt[0], Y=rslt[1], Z=rslt[2])

    @x.setter
    def x(self, value):
        evalCode = """
			Dim dirc(2) as Double
			dirc(0) = X
			dirc(1) = Y
			dirc(2) = Z
			Eksen.PutXAxis dirc
			return = dirc
		"""
        if isinstance(value, XYZ):
            _X=value.X
            _Y=value.Y
            _Z=value.Z

        if isinstance(value, list):
            _X=value[0]
            _Y=value[1]
            _Z=value[2]

        self.anaProgram.eval(evalCode, "Eksen,X,Y,Z", [self.catNesne,_X,_Y,_Z])

    @property
    def y(self)->XYZ:
        evalCode = """
			Dim dirc(2) as Double
			Eksen.GetYAxis dirc
			return = dirc
		"""
        rslt = self.anaProgram.eval(evalCode, "Eksen", [self.catNesne])
        return XYZ(X=rslt[0], Y=rslt[1], Z=rslt[2])

    @y.setter
    def y(self, value):
        evalCode = """
			Dim dirc(2) as Double
			dirc(0) = X
			dirc(1) = Y
			dirc(2) = Z
			Eksen.PutYAxis dirc
			return = dirc
		"""
        if isinstance(value, XYZ):
            _X=value.X
            _Y=value.Y
            _Z=value.Z

        if isinstance(value, list):
            _X=value[0]
            _Y=value[1]
            _Z=value[2]

        self.anaProgram.eval(evalCode, "Eksen,X,Y,Z", [self.catNesne,_X,_Y,_Z])

    @property
    def z(self)->XYZ:
        evalCode = """
			Dim dirc(2) as Double
			Eksen.GetZAxis dirc
			return = dirc
		"""
        rslt = self.anaProgram.eval(evalCode, "Eksen", [self.catNesne])
        return XYZ(X=rslt[0], Y=rslt[1], Z=rslt[2])

    @z.setter
    def z(self, value):
        evalCode = """
			Dim dirc(2) as Double
			dirc(0) = X
			dirc(1) = Y
			dirc(2) = Z
			Eksen.PutZAxis dirc
			return = dirc
		"""
        if isinstance(value, XYZ):
            _X=value.X
            _Y=value.Y
            _Z=value.Z

        if isinstance(value, list):
            _X=value[0]
            _Y=value[1]
            _Z=value[2]

        self.anaProgram.eval(evalCode, "Eksen,X,Y,Z", [self.catNesne,_X,_Y,_Z])