import sys
from typing import Optional

from PySide6.Qt3DCore import Qt3DCore
from PySide6.Qt3DExtras import Qt3DExtras
from PySide6.Qt3DInput import Qt3DInput
from PySide6.Qt3DRender import Qt3DRender
from PySide6.QtCore import QObject, QPoint, QSize, QUrl, QLibraryInfo
from PySide6.QtGui import QColor, QGuiApplication, QVector3D, qRgb
from PySide6.QtWidgets import QApplication


class TrackballCameraController(Qt3DExtras.QAbstractCameraController):
    def __init__(self, parent: Optional[Qt3DCore.QNode]=None):
        super().__init__(parent)

    def moveCamera(self, state: Qt3DExtras.QAbstractCameraController.InputState, dt: float):
        print("moveCamera")


def create_sphere(parent: Qt3DCore.QEntity) -> Qt3DCore.QEntity:
    # Create sphere mesh
    sphere_mesh = Qt3DExtras.QSphereMesh(parent)
    sphere_mesh.setRadius(3.0)

    # Create sphere material
    sphere_material = Qt3DExtras.QPhongMaterial(parent)
    # sphere_material.setDiffuse(QColor(255, 0, 0))
    #
    sphere_transform = Qt3DCore.QTransform(parent)
    # sphere_transform.setTranslation(QVector3D(-3, -3, -3))

    # Create sphere entity
    sphere_entity = Qt3DCore.QEntity(parent)
    sphere_entity.addComponent(sphere_mesh)
    sphere_entity.addComponent(sphere_transform)
    sphere_entity.addComponent(sphere_material)

    return sphere_entity


if __name__ == "__main__":
    print('Python {}.{}.{}'.format(sys.version_info[0], sys.version_info[1],
                                   sys.version_info[2]))
    print(QLibraryInfo.build())
    # Create application
    app = QGuiApplication(sys.argv)

    # Create window
    window = Qt3DExtras.Qt3DWindow()
    window.setTitle("Sphere Example")

    # Create root entity
    root_entity = Qt3DCore.QEntity()

    # Create sphere entity
    sphere_entity = create_sphere(root_entity)

    print(sphere_entity.components())

    camera = window.camera()
    camera.setPosition(QVector3D(0.0, 0.0, 40.0))
    camera.setViewCenter(QVector3D(0.0, 0.0, 0.0))
    camera.lens().setPerspectiveProjection(45.0, 16.0 / 9.0, 0.1, 1000)

    camera_controller = TrackballCameraController(root_entity)
    camera_controller.setCamera(camera)

    # Set root entity as the root of the scene
    window.setRootEntity(root_entity)
    window.defaultFrameGraph().setClearColor(QColor(0, 0, 255))
    # Show window
    window.show()

    # Run application
    sys.exit(app.exec())
