# -*- coding: utf-8 -*-
"""
Created on Sun Jan 19 01:47:31 2014

@author: Bilgisayar
"""
import subprocess
import sys
import os
import inspect

sys.coinit_flags = 0

sys.path.append(
    os.path.dirname(
        os.path.abspath(inspect.getfile(inspect.currentframe()))
    )
)

import inspect
import time
from builtins import print

from pprint import pprint

import os
from typing import List

import json

from win32com.client import Dispatch

from IAktiviteler.IMfgOperasyonlar.IModlar import IlerlemeGecisModu
from IFikatia import IFikatia
from IMfgTakim.IMfgTakim import IMfgTakim, TakimTurIsimleri
from IPPRDokuman import IPPRDokuman
from IParametre import IParametre
from IPartDokuman import IPartDokuman
from IProduct import IProduct
from IProgram import IProgram
from IReferans import IReferans
from IYardimciSiniflar import timeit, SifirKonum
from IAktiviteler.IAktivite import IAktivite
from IProcessDokuman import IProcessDokuman

if __name__ == "__main__":
    subprocess.run(["powershell", " (Add-Type '[DllImport(\"user32.dll\")]public static extern int PostMessage(int h,int m,int w,int l);' -Name a -Pas)::PostMessage(-1,0x0112,0xF170,2)"],
            creationflags=subprocess.CREATE_NO_WINDOW)
    
    # fikatia: IFikatia = IFikatia(Dispatch("Catia.Application"))
    # fikatia.baslik="Buuuu"
    # fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].ncUret(False)
pass

if __name__ == "__main__1":
    fikatia: IFikatia = IFikatia(Dispatch("Catia.Application"))
    fikatia.aktifDokuman.asPartDokuman.processOlustur(kaydet=True)

if __name__ == "__main__2":
    # fikatia: IFikatia = IFikatia(Dispatch("Catia.Application"))
    # _dkmn:IPartDokuman=fikatia.aktifDokuman.asPartDokuman # type: ignore
    # _dkmn.processOlustur(kaydet=True)
    fikatia: IFikatia = IFikatia(Dispatch("Catia.Application"))
    __secililer=fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar
    __prg:IProgram=__secililer[0]# type: ignore 
    # if "FikoYT Takımlar" in __prg.aktiviteler[0].ismi:
    #     __prg.aktiviteler[0].asOperasyon.asPPInstruction.kodlar.degeri="asdf"
    #     print(__prg.aktiviteler[0].asOperasyon.asPPInstruction.kodlar.degeri)
    # fikatia.aktifDokuman.asProcessDokuman.asPPR.kaynaklar.dosyadanTakimlariEkle()
    __prg.inoStandartProgramlariEkle()

    # with open(r'C:\Users\fikritopaloglu\Desktop\file1.txt', 'w') as file:
    #     file.write(json.dumps(__product.toJson["Parcalar"])) 

    # sifirKonum = fikatia.aktifDokuman.asProcessDokuman
    # op = sifirKonum.asProcessDokuman.partOperasyonlari[0].exportFikoGL()

import itertools
import json
import logging
from pprint import pprint
import os

# For the next line, use logging.WARN to turn off debug print, use
# logging.DEBUG to turn on
logging.basicConfig(level=os.getenv("LOGLEVEL", logging.WARN))
logger = logging.getLogger(__name__)


def skip_pass(marker, lines):
    """
    Skip until reach the line which contains the marker, then also skip
    the marker line
    """
    result = itertools.dropwhile(
        lambda line: marker not in line, lines  # Condition
    )  # The lines
    next(result)  # skip pass the marker
    return result


def take(marker, lines):
    """
    Take and return those lines which contains a marker
    """
    result = itertools.takewhile(
        lambda line: marker in line, lines  # Condition
    )  # The lines
    return result


def parse_indexed_face_set(translate, lines):
    """
    Parse one block of 'geometry IndexedFaceSet'
    """
    # lines = skip_pass('geometry IndexedFaceSet', lines)

    # Parse the "point" structure
    lines = skip_pass("point", lines)
    point_lines = take(",", lines)
    verts = [
        [float(token) for token in line.strip(",\n").split()] for line in point_lines
    ]
    logger.debug("verts: %r", verts)

    # parse the coordIndex structure
    lines = skip_pass("coordIndex", lines)
    coor_lines = take(",", lines)
    coord_index = [
        tuple(int(token) for token in line.strip(",\n").split(","))
        for line in coor_lines
    ]
    logger.debug("coord_index: %r", coord_index)

    facets = [[verts[i] for i in indices[:3]] for indices in coord_index]
    logger.debug("facets: %r", facets)

    return dict(vert=verts, facets=facets, translate=translate, normals=[])


def parse_translate(line):
    """
    Given a line such as: "translate 5 6 7", return [5.0, 6.0, 7.0]
    """
    translate = [float(x) for x in line.split()[1:4]]
    return translate


def parse_Viewpoint(translate, lines):
    """
    Parse one block of 'geometry IndexedFaceSet'
    """
    # lines = skip_pass('geometry IndexedFaceSet', lines)

    # Parse the "point" structure
    lines = skip_pass("{", lines)
    point_lines = take("", lines)
    verts = [
        [float(token) for token in line.strip("\n").split()] for line in point_lines
    ]
    print(verts)


def extractDataFromVRML(file):
    indexed_face_sets = []
    translate = []
    viewPoints = []
    with open(file) as infile:
        for line in infile:
            if "geometry IndexedFaceSet" in line:
                a_set = parse_indexed_face_set(translate=translate, lines=infile)
                indexed_face_sets.append(a_set)
            elif "translation" in line and line.split()[0] == "translation":
                translate = parse_translate(line)
            elif "Viewpoint" in line and line.split()[0] == "Viewpoint":
                viewPoints = parse_Viewpoint(translate=viewPoints, lines=infile)

    return indexed_face_sets


# if __name__ == "__main__":
#     indexed_face_sets = extractDataFromVRML("C:\\000.wrl")
#     for a_set in indexed_face_sets:
#         print("vert:", a_set["vert"])
#         print("facets:", a_set["facets"])
#         print("---")

# if __name__ == '__main__':
#     fikatia:IFikatia = IFikatia(Dispatch("Catia.Application"))
#     sifirKonum=fikatia.aktifDokuman.asProcessDokuman
#     tkm=sifirKonum.asPPRDokuman.kaynaklar.takimEkle(TakimTurIsimleri.Normal,name="FikoYT 10Düz",body_diameter="85mm",cutting_length="95mm",length="95mm", nominal_diameter="10mm",corner_radius="0mm")
#     # fikatia.aktifDokuman.asPartDokuman.processOlustur(kaydet=True)
#     # fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].mfgGorunum.CreateAllMachinableAreaFeaturesFromTechResultsOfUDF()

# if __name__ == '__main__':
#     fikatia = IFikatia(Dispatch("Catia.Application"))
# fikatia.aktifDokuman.asPartDokuman.processOlustur(kaydet=True)
# __sfr:SifirKonum = fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].sifirKonum
# print(__sfr.XOlcusu)
# print(__sfr.YOlcusu)
# print(__sfr.ZOlcusu)
# print(__sfr.Zmin)
# print(__sfr.miX0Merkez)
# print(__sfr.miY0Merkez)
# print(__sfr.toStr)


@timeit
def timeitthis(prg):
    _fikoAcilar = prg.aktiviteler[1].fikoAcilar
    _saltAcilar = _fikoAcilar.saltAcilar
    #
    print(prg.ismi)
    print(prg.aktif)
    print(prg.aciklama)
    print(prg.aciliAktiviteVarMi)
    print(prg.tumAcilar)
    print(_saltAcilar.ustAci, _saltAcilar.altAci)
    print(_fikoAcilar.kacmaDegerleri.kacmaDegerleri)
    print(_fikoAcilar.acisalOffset.degerleriAl(0.1))
    print(prg.takimlar2)
    print(prg.enBuyukTakimBoyu)
    print(prg.enYuksekIlerleme)
    print(prg.enYuksekHatve)
    print(prg.enYuksekDevir)
    print(prg.toplamIslemeSuresi)
    print(prg.magazinli)
    print(prg.operasyonBoyutlari)
    print(prg.enDusukCevreOffset)
    print(prg.enDusukYuzeyOffset)
    print(prg.hesaplatilmamisVarMi)
    print(prg.hataKodlari)
    # print(prg.jsonForFikoKit(
    #         [
    #             "ismi", "aktif", "aciklama", "aciliAktiviteVarMi", "takimlar2", "enBuyukTakimBoyu",
    #             "enYuksekIlerleme", "enYuksekHatve", "enYuksekDevir", "toplamIslemeSuresi", "magazinli",
    #             "operasyonBoyutlari", "enDusukCevreOffset", "enDusukYuzeyOffset", "hesaplatilmamisVarMi", "hataKodlari",
    #             "tumAcilar"
    #         ]))


@timeit
def timeitthis1(prg: IProgram):
    # print(prg.po.urunDokumani.dokuman.asPartDokuman.part.catNesne.IsUpToDate(prg.po.kutukListesi[0].catNesne))
    print(
        prg.po.urunDokumani.dokuman.asPartDokuman.part.catNesne.hybridbodies.item(
            1
        ).name
    )


# class PluginBase:
#     subclasses = []
#
#     def __init_subclass__(cls, **kwargs):
#         super().__init_subclass__(**kwargs)
#         cls.subclasses.append(cls)
#         print(cls)
#
# class Plugin1(PluginBase):
#     pass
#
# class Plugin2(PluginBase):
#     pass

# @timeit
def speedLib():
    fikatia = IFikatia(Dispatch("Catia.Application"))
    fikatia.baslik = "Fikatia"

    aktifDoc = fikatia.aktifDokuman

    toolDoc = fikatia.dokumanlar.ac(
        os.path.join(
            os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))),
            "FTK.pyd",
        )
    )

    # toolDoc = fikatia.dokumanlar.oku(r"X:\Tak Ve Kullan\Catia Part Lib\TAKIM_KUTUPHANESI\FIKOTAKIM.CATProcess")
    kokObje = toolDoc.asPPRDokuman.kaynaklar.item(0)
    paramObje = kokObje.parametreler.altParametreler(kokObje, True)

    paramObje["Name"].degeri = "Fk-Std T10/4"

    for x in range(paramObje.sayisi):
        print(paramObje[x].ismi.split("\\")[::-1][0], paramObje[x])
        paramObje["Body diameter"].degeri = 150.0

    kaynaklar = aktifDoc.asPPRDokuman.kaynaklar
    print(kaynaklar.ekle(kokObje))

    toolDoc.kapat()


# if __name__ == '__main__':
#     fikatia = IFikatia(Dispatch("Catia.Application"))
#     fikatia.baslik = "Deneme"
#     # speedLib()
#     print(fikatia.dokumanlar)
#     for x in range(1):
#         tkm = fikatia.aktifDokuman.asPPRDokuman.kaynaklar.takimEkle(takimTipi=TakimTurIsimleri.Silindir_Takim, name="Tap."+str(x),
#                                                                     comment="Olası Bir Takım Gerekçesi",
#                                                                     tool_number=str(x),
#                                                                     )


# =============================================================================
#     print(fikatia.aktifDokuman.asType("ProcessDocument",IProcessDokuman).tumProgramlar[0].aktiviteler[1].po.programlar[0].po)
# =============================================================================

# ---------------->
# speedLib()
# sonTkm=fikatia.aktifDokuman.asPPRDokuman.kaynaklar.item(1)
# sonTkm.dokuman.asProductDokuman.yeniPencere()
# print(sonTkm.asType("Reference",IReferans).catNesne)
# sonTkmParam=sonTkm.parametreler.altParametreler( sonTkm.asType("Reference",IReferans), True)
#
# # sonTkm.parametreler["Name"].degeriStr="12 Küre Tutucu"
# print(sonTkm.parametreler())


# [A] IFiko Soraluce Açı
# print(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].aktiviteler[1].acilar.soraluce.acilar)
# print(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].aktiviteler[1].acilar.soraluce.eksenAktar(102.5,145.0))

# timeitthis(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[4])

# [A] Aktivite Çeşidi (Kaba Kabadan Kalan Vs) Tahminleri

# print(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].aktiviteler[1].tahminCesit)


# [A] Parametre Değişimi İçin Seçili Aktivitelerden
# print(fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].urunDokumani.pozisyon)
# exit(0)
# exit(0)
#     seciliObjeler=fikatia.aktifDokuman.asProcessDokuman.secililer()
#     toplam = len(seciliObjeler)
#     for akt in  range(toplam):
#         # seciliObjeler[akt].nesne.parametreler["Machining tolerance"].degeri=0.01
#         seciliObjeler[akt].nesne.parametreler["Maximum distance"].degeri=0.65
#         # seciliObjeler[akt].nesne.parametreler["Offset on part"].degeri=0.0
#         # seciliObjeler[akt].nesne.parametreler["Machining feedrate"].degeriStr=7000.0
#         # seciliObjeler[akt].nesne.parametreler["Step distance"].degeri=0.15
#         # seciliObjeler[akt].nesne.parametreler["Maximum width to machine"].degeri=15.0
#         # seciliObjeler[akt].nesne.parametreler["Stepover mode"].degeriStr="M3xStepOverModeConstantOnPart"
#         # if not seciliObjeler[akt].nesne.parametreler["Offset side"].degeriStr == "M3xSideRight":
#         #     seciliObjeler[akt].nesne.parametreler["Offset side"].degeriStr = "M3xSideRight"
#         # else:
#         #     seciliObjeler[akt].nesne.parametreler["Offset side"].degeriStr = "M3xSideLeft"
#         # seciliObjeler[akt].nesne.parametreler["Offset side"].degeriStr="M3xSideRight"
#         fikatia.durumCubugu=" Program Yapılıyor "+seciliObjeler[akt].nesne.ismi+"---->"+ str(akt+1)+" / "+str(toplam)
#         # time.sleep(9)
#         print("FikoYT Program Yapılıyor "+seciliObjeler[akt].nesne.ismi,"---->", akt+1," / ",toplam)
#     print("Program Yapımı Tamamlandı")
#     print("Catiadan Programların Hesaplatılması İstendi")
#     fikatia.aktifDokuman.asProcessDokuman.kaydet()
#     fikatia.komut("Replay Tool Path")


# [A] Deneme Product
# fikatia.gorunur=True
# __product=fikatia.aktifDokuman.asProductDokuman.product
# pprint(__product.numokratorHazirla())

# print([prg.parametreler()  for prg in fikatia.aktifDokuman.asProcessDokuman.tumProgramlar])
# print(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].miAktiviteTuruVar(['MfgCopyOrder', 'MfgTracutOperation', 'MfgCopyOperation', 'MfgCopyOrder']))

# print(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].aktiviteler[0].takim.resimDosyasi)
# fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].makine.postTuru = "APT"
# print(fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].makine.postTuru)

# gen= fikatia.aktifDokuman.asProductDokuman.product.productlar.item(1).catNesne.getitem("DECProductToPart")
# gen.run()
# print(gen.GetResult().name)
# StartCommand(CATIA.Startcommand(CATProductToPartCmdHeader))

# print( fikatia.aktifDokuman.asProductDokuman.product.toJson['Parcalar'] )
# print( fikatia.aktifDokuman.asProductDokuman.product.altObjeler[2] )
# print( fikatia.aktifDokuman.asProductDokuman.product.productlar.item(1).partaCevir("Deneme") )
# print(fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].programlar[0].aktiviteler[1].fikoAcilar.takim)
# print(fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].islemeEkseni)
# print(fikatia.aktifDokuman.asPPRDokuman.productlar.item(0).dokuman.asPartDokuman.part.eksenler[1].ismi)
# print(fikatia.aktifDokuman.asPPRDokuman.productlar.item(0).dokuman.asPartDokuman.part.eksenler[1].merkez)
# print(fikatia.aktifDokuman.asPPRDokuman.productlar.item(0).dokuman.asPartDokuman.part.eksenler[1].x)
# print(fikatia.aktifDokuman.asPPRDokuman.productlar.item(0).dokuman.asPartDokuman.part.eksenler[1].y)
# print(fikatia.aktifDokuman.asPPRDokuman.productlar.item(0).dokuman.asPartDokuman.part.eksenler[1].z)

# stiEngine = fikatia.catNesne.GetItem("CAIEngine")
# # The GetStiDBItemFromAnyObject() needs a document object as parameter.
# stiDbItem = stiEngine.GetStiDBItemFromAnyObject(fikatia.aktifDokuman.asProductDokuman.product.catNesne.ReferenceProduct.Parent)
# stiChildren = stiDbItem.GetChildren()
# for i in range(1, stiChildren.Count + 1):
#     fullPath = stiChildren.Item(i).GetDocumentFullPath()
#     print(fullPath)

# print(olculeriAlPO(fikatia))

# prgler = fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar
# for prg in prgler:
#     aktler=prg.aktiviteler()
#     for akt in aktler:
#         print(akt.hatve.degeriStr if akt.hatve != None else 0.0 )

# timeitthis(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0])

# print(fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].Z0)
# print(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].aktiviteler[1].acilar.tav20Er32)
# print(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].aktiviteler[1].fikoAcilar.AC_Acisi)
# print(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].aktiviteler[1].fikoAcilar.BC_Acisi)
# print(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].aktiviteler[1].fikoAcilar.acisalOffset.degerleriAl(0.1))

# qapp=QCoreApplication(sys.argv)
# akt=fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].programlar[1].aktiviteler[1]
# akt=fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].aktiviteler[1]
# popup = QFikatiaTav20AcilarPopup1(Prg=fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].programlar[1], itm=akt)
# popup.show()
# sys.exit(qapp.exec_())

# print(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].aktiviteler[1].acilar.soraluce.acilar)

# print(fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0])
# print(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0].aktiviteler[1].yanalAdim)

# print(akt.turu)
# print(akt.hatve)
# print(akt.po.dizaynGeometriListesi[0])

# timeitthis(fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar[0])

# po = fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].catNesne.GetManufacturingView()
# for i in range(1, po.ManufacturingFeatures.count):
#     try:
#         print(po.ManufacturingFeatures.item(i).type)
#         print(po.ManufacturingFeatures.item(i).GetAGeometricAttribute("Guide.1"))
#     except:
#         pass

# -->
# EvalCode = """
#     dim rslt as ManufacturingOperation
#     set rslt = Aktivite
#
#     rslt.RemoveAllGeometry
#
#     set return = rslt
# """
# aktvt = fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].programlar[1].aktiviteler[1]
# rslt = fikatia.eval(EvalCode, "Aktivite as Object", [aktvt.catNesne])
# print(rslt)
# --->


# nesne=fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].urunDokumani.referansProduct.dokuman.asPartDokuman.part.catNesne.bodies.item(3)
# asd=fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].programlar[1].aktiviteler[1].catNesne.GetFeature()
# print(rslt)
# --->
# fikatia.baslik = "buuuuuu"
# po = fikatia.aktifDokuman.asProcessDokuman.partOperasyonlari[0].mfgGorunum.mfgOzellikler.item(522)
#
# print(po.catNesne.RemoveAllGeometry())
