# Copyright (c) Microsoft Corporation. 
# Licensed under the MIT license. 

import math
import os
import sys
import glob
import gc
import threading

from pathlib import Path
from simplygon import simplygon_loader
from simplygon import Simplygon


def RunReduction(sg: Simplygon.ISimplygon):
    sgSceneImporter = sg.CreateSceneImporter()
    sgSceneImporter.SetImportFilePath( "../Assets/RiggedSimplygonMan/RiggedSimplygonMan.fbx" )
    if not sgSceneImporter.RunImport():
        raise Exception("Failed to load RiggedSimplygonMan/RiggedSimplygonMan.fbx.")
    sgScene = sgSceneImporter.GetScene()

    # Create the reduction processor. 
    sgReductionProcessor = sg.CreateReductionProcessor()

    sgReductionProcessor.SetScene( sgScene )

    sgReductionSettings = sgReductionProcessor.GetReductionSettings()

    # Set reduction target to triangle ratio with a ratio of 50%. 
    sgReductionSettings.SetReductionTargets( Simplygon.EStopCondition_All, True, False, False, False )
    sgReductionSettings.SetReductionTargetTriangleRatio( 0.5 )

    # Enable symmetry detection in the reduction process. 
    sgReductionSettings.SetKeepSymmetry( True )
    sgReductionSettings.SetSymmetryAxis( Simplygon.ESymmetryAxis_X )
    sgReductionSettings.SetSymmetryOffset( 0.0 )
    sgReductionSettings.SetSymmetryDetectionTolerance( 0.0001 )
    sgReductionSettings.SetUseAutomaticSymmetryDetection( False )
    sgReductionSettings.SetUseSymmetryQuadRetriangulator( True )

    # Start the reduction process. 
    sgReductionProcessor.RunProcessing()

    sgSceneExporter = sg.CreateSceneExporter()
    sgSceneExporter.SetScene(sgScene)
    sgSceneExporter.SetExportFilePath( "ReductionOutput.fbx" )
    if not sgSceneExporter.RunExport():
        raise Exception("Failed to save ReductionOutput.fbx.")


if __name__ == '__main__':
    sg = simplygon_loader.init_simplygon()

    RunReduction(sg)

    sg = None
    gc.collect()

