from enum import Enum

from win32com.client import CDispatch

from IFikomObject import IFikomObject
from IMfgTakim.IMfgTakimDogrulayicisi import IMfgTakimDogrulayicisi
from IParametre import IParametre

__author__ = 'CAM'


class TakimTurleri(Enum):
    Normal = "MfgEndMillTool"
    Yuzey = "MfgFaceMillTool"
    Konik = "MfgConicalMillTool"
    Matkap = "MfgDrillTool"
    Nokta = "MfgSpotDrillTool"
    Punta = "MfgCenterDrillTool"
    Cift_Cap_Matkap = "MfgMultiDiamDrillTool"
    Havsa = "MfgCountersinkTool"
    Tap = "MfgTapTool"
    Cift_Taraf_Pah = "MfgTwoSidesChamferingTool"
    Delik_Pah = "MfgBoringAndChamferingTool"
    Bara = "MfgBoringBarTool"
    Rayba = "MfgReamerTool"
    T_Cakisi = "MfgTSlotterTool"
    Kilavuz = "MfgThreadMillTool"
    Kafa_Matkabi = "MfgCounterboreMillTool"
    Varil_Takimi = "MfgBarrelMillTool"
    Top_Takimi = "MfgBallStylusTool"
    Silindir_Takim = "MfgCylinderStylusTool"


class TakimTurIsimleri(Enum):
    Normal = "Frezeleme Takımı"
    Yuzey = "Yüzey Traşlama Takımı"
    Konik = "Konik Takım"
    Matkap = "Matkap"
    Nokta = "Nokta Takımı"
    Punta = "Punta Matkabı"
    Cift_Cap_Matkap = "Kademeli Matkap"
    Havsa = "Havşa Matkabı"
    Tap = "Tap Takımı"
    Cift_Taraf_Pah = "Çift Taraflı Pah Takımı"
    Delik_Pah = "Havşalı Matkap"
    Bara = "Bara Takımı"
    Rayba = "Rayba"
    T_Cakisi = "T Kanal Takımı"
    Kilavuz = "Kılavuz Takımı"
    Kafa_Matkabi = "Kafa Matkabı"
    Varil_Takimi = "Varil Takımı"
    Top_Takimi = "Küresel Top Takımı"
    Silindir_Takim = "Silindir Takım"


class IMfgTakim(IFikomObject):
    def __init__(self, obj:CDispatch, sahip:IFikomObject=None):
        super(IMfgTakim, self).__init__(obj, sahip)
        self.sahip = sahip
        self.tipi = "IMfgTakim"

    @property
    def aciklama(self) -> str:
        return self.catNesne.Comment

    @aciklama.setter
    def aciklama(self, value:str):
        self.catNesne.Comment = value

    @property
    def dogrulayiciSayisi(self) -> int:
        return self.catNesne.CorrectorCount

    @dogrulayiciSayisi.setter
    def dogrulayiciSayisi(self, value:int):
        self.catNesne.CorrectorCount = value

    @property
    def ozellikSayisi(self) -> int:
        return self.catNesne.NumberOfAttributes

    @ozellikSayisi.setter
    def ozellikSayisi(self, value:int):
        self.catNesne.NumberOfAttributes = value

    @property
    def resimDosyasi(self) -> str:
        return self.catNesne.Picture

    @resimDosyasi.setter
    def resimDosyasi(self, value:str):
        self.catNesne.Picture = value

    @property
    def takimNo(self) -> int:
        return self.catNesne.ToolNumber

    @takimNo.setter
    def takimNo(self, value:int):
        self.catNesne.ToolNumber = value

    @property
    def turu(self) -> TakimTurleri:
        return TakimTurleri._value2member_map_[self.catNesne.ToolType]

    @turu.setter
    def turu(self, value:TakimTurleri):
        self.catNesne.ToolType = value

    @property
    def turIsmi(self) -> str:
        return TakimTurIsimleri[self.turu.name].value

    def NlsIsmi(self, value:str) -> str:
        return self.catNesne.GetAttributeNLSName(value)

    def parametre(self, value) -> IParametre:
        return IParametre(obj=self.catNesne.GetAttribute(value), sahip=self)

    def yeniDogrulayici(self) -> IMfgTakimDogrulayicisi:
        return IMfgTakimDogrulayicisi(obj=self.catNesne.AddCorrector(), sahip=self)

    def dogrulayici(self, value:int):
        return IMfgTakimDogrulayicisi(obj=self.catNesne.GetCorrector(value), sahip=self)

    @property
    def aptParametreleri(self):
        EvalCode = """
			dim RGB()
			takim.GetListOfAptParameters RGB

			return = RGB
		"""
        return self.anaProgram.eval(EvalCode, "takim", [self.catNesne])

    @property
    def anmaCapi(self) -> IParametre:
        return self.parametre("MFG_NOMINAL_DIAM")

    @property
    def radius(self) -> IParametre:
        return self.parametre("MFG_CORNER_RAD")

    @property
    def tamBoyu(self) -> IParametre:
        return self.parametre("MFG_OVERALL_LGTH")

    @property
    def kesmeBoyu(self) -> IParametre:
        return self.parametre("MFG_CUT_LENGTH")

    @property
    def boyu(self) -> IParametre:
        return self.parametre("MFG_LENGTH")

    @property
    def disCapi(self) -> IParametre:
        return self.parametre("MFG_BODY_DIAM")

    @property
    def bosCap(self) -> IParametre:
        return self.parametre("MFG_TOOL_CORE_DIAMETER")

    @property
    def toStr(self):
        rslt=""
        if self.turu == TakimTurleri.Normal:
            rslt = 'Ø' + str(self.anmaCapi.degeri)
            if self.radius.degeri > 0:
                rslt = rslt + ' R'+str(self.radius.degeri)
            rslt = rslt + " " + self.turIsmi
        elif self.turu == TakimTurleri.Matkap:
            rslt = 'Ø' + str(self.anmaCapi.degeri)
            rslt = rslt + " " + self.turIsmi
        elif self.turu == TakimTurleri.Rayba:
            rslt = 'Ø' + str(self.anmaCapi.degeri)
            rslt = rslt + " " + self.turIsmi
        elif self.turu == TakimTurleri.Punta:
            rslt = 'Ø' + str(self.anmaCapi.degeri)
            rslt = rslt + " " + self.turIsmi
        elif self.turu == TakimTurleri.Konik:
            rslt = "Çizgi / Kalem Takımı (Konik Takım)"
        elif self.turu == TakimTurleri.Yuzey:
            rslt = 'Ø' + str(self.anmaCapi.degeri)
            if self.radius.degeri > 0:
                rslt = rslt + ' R'+str(self.radius.degeri)
            rslt = rslt + " " + self.turIsmi
        elif self.turu == TakimTurleri.T_Cakisi:
            rslt= "T - Çakısı (Slot Çakısı)"
        elif self.turu == TakimTurleri.Kilavuz:
            rslt= "M"+str(self.parametre("MFG_OUTSIDE_DIAM").degeri)+" Kılavuz"
        elif self.turu == TakimTurleri.Kafa_Matkabi:
            rslt= "DØ"+ str(self.anmaCapi.degeri)
            if self.parametre("MFG_ENTRY_DIAM").degeri > 0:
                rslt = rslt + '<->dØ'+str(self.parametre("MFG_ENTRY_DIAM").degeri)
            rslt += " Kafa Matkabı"
        elif self.turu == TakimTurleri.Nokta:
            rslt = 'Ø' + str(self.anmaCapi.degeri)
            rslt = rslt + " " + self.turIsmi
        rslt = rslt + " ("+self.ismi+")"
        return rslt

    @property
    def toStr2(self):
        rslt=""
        if self.turu == TakimTurleri.Normal:
            rslt = 'Ø' + str(self.anmaCapi.degeri)
            if self.radius.degeri > 0:
                if self.radius.degeri < self.anmaCapi.degeri/2:
                    rslt = rslt + ' R'+str(self.radius.degeri)
                else:
                    rslt = rslt + ' Küre'
            else:
                rslt = rslt + " Düz"
        elif self.turu == TakimTurleri.Matkap:
            rslt = 'Ø' + str(self.anmaCapi.degeri)+" Matkap"
        elif self.turu == TakimTurleri.Rayba:
            rslt = 'Ø' + str(self.anmaCapi.degeri)+" Rayba"
        elif self.turu == TakimTurleri.Punta:
            rslt = 'Ø' + str(self.anmaCapi.degeri)
        elif self.turu == TakimTurleri.Konik:
            rslt = "Çizgi Takımı"
        elif self.turu == TakimTurleri.Yuzey:
            rslt = 'Ø' + str(self.anmaCapi.degeri)
            if self.radius.degeri > 0:
                if self.radius.degeri < self.anmaCapi.degeri/2:
                    rslt = rslt + ' R'+str(self.radius.degeri)
                else:
                    rslt = rslt + ' Küre'
            else:
                rslt = rslt + " Düz"
        elif self.turu == TakimTurleri.T_Cakisi:
            rslt= 'Ø' + str(self.anmaCapi.degeri)+"x"+str(self.boyu.degeri)+" T"
        elif self.turu == TakimTurleri.Kilavuz:
            rslt= "M"+str(self.parametre("MFG_OUTSIDE_DIAM").degeri)+" Kılavuz"
        elif self.turu == TakimTurleri.Kafa_Matkabi:
            rslt= "DØ"+ str(self.anmaCapi.degeri)
            if self.parametre("MFG_ENTRY_DIAM").degeri > 0:
                rslt = rslt + '<->dØ'+str(self.parametre("MFG_ENTRY_DIAM").degeri)
        elif self.turu == TakimTurleri.Nokta:
            rslt = 'Ø' + str(self.anmaCapi.degeri)
            rslt = rslt + " " + self.turIsmi
        rslt = rslt
        return rslt

    def __str__(self) -> str:
        return repr(self.ismi)