# -*- coding:utf-8 -*-
# title           :水星、金星凌日
# description     :天象奇观：水星、金星凌日
# author          :Python超人
# date            :2023-02-11
# link            :https://gitcode.net/pythoncr/
# python_version  :3.8
# ==============================================================================
from bodies import Sun, Mercury, Venus, Earth
from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY, SECONDS_PER_HOUR, AU
from sim_scenes.func import ursina_run, set_camera_parent
from simulators.ursina.entities.body_timer import TimeData
from simulators.ursina.ursina_event import UrsinaEvent

if __name__ == '__main__':
    # 水星、金星凌日
    # 以地球的视角看水星、金星凌日
    earth = Earth(
        name="地球",
        rotate_angle=0,  # 不倾斜
        rotation_speed=0,  # 不旋转
        texture="transparent.png"  # 地球纹理透明，不会挡住摄像机视线
    )
    sun = Sun(name="太阳", size_scale=5e1)  # 太阳放大 50 倍
    bodies = [
        sun,
        earth,
        Mercury(name="水星",
                init_position=[0.384 * AU, 0, 0],
                init_velocity=[0, 0, 47.87],
                size_scale=5e1),  # 水星放大 50 倍，距离保持不变
        Venus(name="金星",
              init_position=[0.721 * AU, 0, 0],
              init_velocity=[0, 0, 35],
              size_scale=5e1)  # 金星放大 50 倍，距离保持不变
    ]

    # 让太阳的旋转速度放慢10倍
    sun.rotation_speed /= 10


    def on_ready():
        from ursina import camera
        # 摄像机跟随地球（模拟在地球上看到的效果）
        set_camera_parent(earth)

        if hasattr(camera, "sky"):
            # 摄像机跟随地球后，需要对深空背景进行调整，否则看到的是黑色背景
            camera.sky.scale = 800
            camera.clip_plane_near = 0.1
            camera.clip_plane_far = 1000000


    def on_timer_changed(time_data: TimeData):
        # 时时刻刻的让地球看向太阳（摄像机跟随地球看向太阳）
        earth.look_at(sun, rotation_z=0)


    # 订阅事件后，上面2个函数功能才会起作用
    # 运行前会触发 on_ready
    UrsinaEvent.on_ready_subscription(on_ready)
    # 运行中，每时每刻都会触发 on_timer_changed
    UrsinaEvent.on_timer_changed_subscription(on_timer_changed)

    # 使用 ursina 查看的运行效果
    # 常用快捷键： P：运行和暂停  O：重新开始  I：显示天体轨迹
    # position = 左-右+、上+下-、前+后-
    ursina_run(bodies, SECONDS_PER_WEEK,
               position=[0, 0, 0],  # 以地球为中心的位置
               show_timer=True)
