__author__ = 'PC'

import inspect
import os

from IAktiviteler import IAktivite


class IAciSoraluce(object):
    def __init__(self, Aktv: IAktivite):
        self.Aktivite = Aktv
        self.tav20Er32 = self.Aktivite.acilar.tav20Er32
        self.anaProgram = Aktv.anaProgram
        self.kafaAdimi = 2.5

    @property
    def islenebilir(self):
        if (self.tav20Er32.ustAci < 90 or self.tav20Er32.ustAci > 270) and self.tav20Er32.altAci < 180:
            return True
        else:
            return False

    def saltAciAl(self, docKapat=True):
        # try:
        ScriptYolu = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
        TempDsya = os.path.realpath(ScriptYolu + u"\\..\\Prg\\FikoDosya\\Src.FikoDll")
        # os.rename(TempDsya,ScriptYolu+
        # "\\Prg\\FikoDosya\\"+"Src.CATPart")
        #        except:
        #            pass
        #        dosya=os.path.realpath(ScriptYolu+
        #                    u"\\Prg\\FikoDosya\\Src.CATPart")

        self.doc = self.anaProgram.catNesne.Documents.Read(TempDsya)
        part = self.doc.Part
        params = part.Parameters

        tavUst = params.Item(u"Ust")
        tavAlt = params.Item(u"Alt")

        tavUst.Value = float(self.tav20Er32.ustAci)
        tavAlt.Value = float(self.tav20Er32.altAci)

        part.update()

        srBK = params.Item(u"BAci").value
        srCK = params.Item(u"CAci").value

        srB = round(srBK / self.kafaAdimi) * self.kafaAdimi
        srC = round(srCK / self.kafaAdimi) * self.kafaAdimi

        prmEksB = params.Item(u"eksBAcisi")
        prmEksC = params.Item(u"eksCAcisi")

        prmEksB.Value = srB
        prmEksC.Value = srC
        part.update()

        BFark = srB - srBK
        CFark = srC - srCK

        srAciFark = params.Item(u"AciFark").value

        if docKapat:
            self.doc.close()

        # try:
        #            TempDsya=os.path.realpath(ScriptYolu+
        #                    u"\\Prg\\FikoDosya\\Src.CATPart")
        #            os.rename(TempDsya,ScriptYolu+"\\Prg\\FikoDosya\\Src.FikoDll")
        #        except:
        #            pass

        return { "B": float(srB), "C": float(srC), "AciFarki": srAciFark, "BFark": BFark, "CFark": CFark }

    @property
    def acilar(self):
        ust = self.tav20Er32.ustAci
        alt = self.tav20Er32.altAci
        # self.HsoHiz()
        UAtoBc = { "B": 0.000, "C": 0.000, "Islenebilir": True, "Dik": False, "Hata": False,
                   "AciFarki": 0.0, "BFark": 0.0, "CFark": 0.0 }
        # - Dik Acilar
        if alt == 180.000:
            UAtoBc["B"] = 180.000
            UAtoBc["C"] = 0.000
            UAtoBc["Islenebilir"] = True
            UAtoBc["Dik"] = True
        if ust == 270.000 and alt == 90.000:
            UAtoBc["B"] = 90.000
            UAtoBc["C"] = 0.000
            UAtoBc["Islenebilir"] = True
            UAtoBc["Dik"] = True
        if ust == 180.000 and alt == 90.000:
            UAtoBc["B"] = 0.000
            UAtoBc["C"] = 180.000
            UAtoBc["Islenebilir"] = True
            UAtoBc["Dik"] = True
        if ust == 90.000 and alt == 90.000:
            UAtoBc["B"] = 270.000
            UAtoBc["C"] = 0.000
            UAtoBc["Islenebilir"] = True
            UAtoBc["Dik"] = True
        if ust == 0.000 and alt == 0.000:
            UAtoBc["B"] = 0.000
            UAtoBc["C"] = 0.000
            UAtoBc["Islenebilir"] = True
            UAtoBc["Dik"] = True

        if self.islenebilir:
            print(u"Bu Acilarda Soralucede Islem Yapilamaz")
            UAtoBc = { "B": 0.000, "C": 0.000, "Islenebilir": False, "Dik": False, "Hata": True,
                       "AciFarki": 0.0, "BFark": 0.0, "CFark": 0.0 }

        if UAtoBc["Dik"] == False and UAtoBc["Hata"] == False and UAtoBc["Islenebilir"] == True:
            SrAci = self.saltAciAl()
            UAtoBc["B"] = SrAci["B"]
            UAtoBc["C"] = SrAci["C"]
            UAtoBc.update(SrAci)
        # self.HsoHiz(False)
        return UAtoBc

    def aciDuzelt(self, B, C, docKapat=True):
        self.saltAciAl(docKapat=False)
        # --->
        part = self.doc.Part
        params = part.Parameters

        srBK = params.Item(u"BAci").value
        srCK = params.Item(u"CAci").value

        prmEksB = params.Item(u"eksBAcisi")
        prmEksC = params.Item(u"eksCAcisi")

        prmEksB.Value = B
        prmEksC.Value = C

        part.update()

        srB = prmEksB.Value
        srC = prmEksC.Value

        BFark = srB - srBK
        CFark = srC - srCK

        srAciFark = params.Item(u"AciFark").value

        if docKapat:
            self.doc.close()

        return { "B": float(B), "C": float(C), "Aci Farki": srAciFark, "BFark": BFark, "CFark": CFark }

    def eksenAktar(self, B, C):
        PO = self.Aktivite.po.catNesne
        PoVector = self.Aktivite.po.eksen()
        # --->
        Aci = self.aciDuzelt(B=B, C=C, docKapat=False)
        # --->
        part = self.doc.Part
        merkezEksen = part.AxisSystems.item(2)

        merkezEksen.PutOrigin(PoVector[3])
        merkezEksen.PutXAxis(PoVector[0])
        merkezEksen.PutYAxis(PoVector[1])
        merkezEksen.PutZAxis(PoVector[2])
        part.update()

        params = part.Parameters
        NewAxisVector = [
            [params.item("YeniEksenOX").Value, params.item("YeniEksenOY").Value, params.item("YeniEksenOZ").Value],
            [params.item("YeniEksenXX").Value, params.item("YeniEksenXY").Value, params.item("YeniEksenXZ").Value],
            [params.item("YeniEksenYX").Value, params.item("YeniEksenYY").Value, params.item("YeniEksenYZ").Value],
            [params.item("YeniEksenZX").Value, params.item("YeniEksenZY").Value, params.item("YeniEksenZZ").Value]]

        MfgView = PO.GetManufacturingView()
        MfgFeatures = MfgView.ManufacturingFeatures
        NewAxis = MfgFeatures.Add("MfgMachiningAxisSystem")

        NewAxis.SetOriginPointByCoordinates(NewAxisVector[0][0], NewAxisVector[0][1], NewAxisVector[0][2])
        NewAxis.SetOriginXDirection(NewAxisVector[1][0], NewAxisVector[1][1], NewAxisVector[1][2])
        NewAxis.SetOriginZDirection(NewAxisVector[3][0], NewAxisVector[3][1], NewAxisVector[3][2])
        NewAxis.Name = "FikoYT " + "B=" + str(B) + "° " + "C=" + str(C) + "°"
        PO.Name = "FikoYT " + "B =" + str(Aci["B"]) + "° " + "C =" + str(Aci["C"]) + "° Fark =" + str(
                Aci["Aci Farki"]) + "°"
        PO.MachiningAxisSystem = NewAxis

        self.doc.close()

        return NewAxisVector

    def __call__(self):
        return self.acilar

    def __str__(self):
        return repr(self.acilar)
