# !/usr/bin/env python3
import os
# DB4L8R This is needed because I have to use a cust build of VTK and can't figure out how to get the Pythin wheel to include the dlls...
os.add_dll_directory(r'E:/Software/vtk/build/bin/Release')
import math
from timeit import default_timer as timer

from dataclasses import dataclass

# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingFreeType
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2


from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)

from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkCommonExecutionModel import vtkAlgorithm

from vtkmodules.vtkCommonCore import (
    VTK_OBJECT,
    vtkCommand,
)
from vtkmodules.vtkCommonDataModel import vtkDataObject
from vtkmodules.util.misc import calldata_type

from vtkmodules.vtkRenderingCore import vtkUniforms
from vtkmodules.vtkFiltersGeneral import vtkWarpVector

from vtkmodules.vtkFiltersGeneral import vtkTransformPolyDataFilter
from vtkmodules.vtkCommonTransforms import vtkTransform

from vtkmodules.vtkCommonCore import vtkAnimationCue, vtkCallbackCommand
from vtkmodules.vtkCommonDataModel import vtkAnimationScene
from vtkmodules.vtkCommonMath import vtkMatrix4x4

from vtkmodules.numpy_interface import dataset_adapter as dsa

from vtkmodules.vtkCommonCore import vtkSMPTools
from vtkmodules.vtkFiltersCore import vtkArrayCalculator
import numpy as np
from scipy.spatial.transform import Rotation as R

import vtk_writer
from vtkmodules.util.numpy_support import numpy_to_vtk


def main():
    vtkSMPTools.SetBackend("STDThread")
    #print('Estimated default number of threads : {}'.format(vtkSMPTools.GetEstimatedDefaultNumberOfThreads()))
    #print('Estimated number of threads : {}'.format(vtkSMPTools.GetEstimatedNumberOfThreads()))
    # Spehere with radius 1000 centered at 1000, 0, 0 
    source=vtkSphereSource(
        output_points_precision=vtkAlgorithm.SINGLE_PRECISION,
        center=[1000, 0, 0],
        radius=1000.0,
        theta_resolution=5000,
        phi_resolution=5000)
    source.GenerateNormalsOff()

    renderer = vtkRenderer()
    render_window = vtkRenderWindow(size=(640, 480), window_name='Sphere')
    render_window.AddRenderer(renderer)
    render_window_interactor = vtkRenderWindowInteractor()
    render_window_interactor.render_window = render_window

    mapper = vtkPolyDataMapper()
    source >> mapper
    
    actor = vtkActor(mapper=mapper)
    actor.property.edge_visibility = False

    renderer.AddActor(actor)

    renderer.ResetCamera()
    renderer.active_camera.Azimuth(30)
    renderer.active_camera.Elevation(30)
    renderer.ResetCameraClippingRange()

    # Render and interact.
    render_window.Render()

    render_window_interactor.Start()

if __name__ == '__main__':
    main()