from typing import List

__author__ = 'CAM'

from win32com.client import CDispatch
from pywintypes import com_error
from IFikomObject import IFikomObject
from IParametreSeti import IParametreSeti
from IParametre import IParametre





class IParametreler(IFikomObject):
    def __init__(self, obj:CDispatch, sahip:IFikomObject=None):
        super(IParametreler, self).__init__(obj, sahip)
        self.sahip = sahip
        self.tipi = "IParametreler"

    # --->Sabit Degiskenler

    @property
    def kaynakParametreSeti(self) -> IParametreSeti:
        return IParametreSeti(self.catNesne.RootParameterSet, self)

    def altParametreler(self, Obje, Yinelemeli=False):
        ObjeTemp = None
        if isinstance(Obje, IFikomObject):
            ObjeTemp = Obje.catNesne
        else:
            ObjeTemp = Obje
        return IParametreler(self.catNesne.SubList(ObjeTemp, Yinelemeli), self)


    def parametreVarmi(self, Param) -> bool:
        # if type(Param) == int:
        #     Param = Param + 1
        try:
            self[Param].degeri
            return True
        except com_error as e:
            return False

    def item(self, i):
        if type(i) == int:
            i = i + 1
            return IParametre(self.catNesne.Item(i), self)
        elif len(str(i).split(">>>"))==1:
            return IParametre(self.catNesne.Item(i), self)
        else:
            __rslt:List[IParametre]=[]
            paramStr=str(i).split(">>>")[0]

            for prm in reversed(range(self.sayisi)):
                if self[prm].ismi.split("\\")[::-1][0] == paramStr:
                    return self[prm]


    def sil(self, i):
        if type(i) == int:
            i = i + 1
        self.catNesne.Remove(i)

    @property
    def sayisi(self) -> int:
        return int(self.catNesne.Count)

    def yaratBoolean(self, Ismi, Degeri=False):
        val = self.catNesne.CreateBoolean(Ismi, Degeri)
        params = IParametre(val, self)
        return params


    def yaratOlcu(self, Ismi, Birimi="LENGTH", Degeri=0.0):
        """
            "LENGTH": the unit is the meter.
            "ANGLE": the unit is the radian.
        """
        val = self.catNesne.CreateDimension(Ismi, Birimi, Degeri)
        params = IParametre(val, self)
        return params


    def yaratTamSayi(self, Ismi, Degeri=-1):
        val = self.catNesne.CreateInteger(Ismi, Degeri)
        params = IParametre(val, self)
        return params

    def yaratSayi(self, Ismi, Degeri=-1):
        val = self.catNesne.CreateReal(Ismi, Degeri)
        params = IParametre(val, self)
        return params

    def yaratYazi(self, Ismi, Degeri=""):
        val = self.catNesne.CreateString(Ismi, Degeri)
        params = IParametre(val, self)
        return params

    def parametreSetiYarat(self, Obje):
        ObjeTemp = None
        if isinstance(Obje, IFikomObject):
            ObjeTemp = Obje.catNesne
        else:
            ObjeTemp = Obje
        self.catNesne.CreateSetOfParameters(ObjeTemp)

    def IliskidekiIsmi(self, Obje):
        ObjeTemp = None
        if isinstance(Obje, IFikomObject):
            ObjeTemp = Obje.catNesne
        else:
            ObjeTemp = Obje
        return self.catNesne.GetNameToUseInRelation(ObjeTemp)

    def __call__(self) -> list:
        Sayisi = self.sayisi
        # return [self.item(x) for x in range(Sayisi)]
        return list(map(lambda x:self.item(x),range(Sayisi)))

    def __str__(self) -> str:
        Sayisi = self.sayisi
        return repr([str(self.item(x)) for x in range(Sayisi)])

    def __len__(self) -> int:
        return int(self.sayisi)

    def __getitem__(self, item) -> IParametre:
        return self.item(item)