// src/components/Satellite.jsx
import React, { useRef, useState, useEffect } from 'react';
import { useFrame, useLoader } from '@react-three/fiber';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
import * as THREE from 'three';

// ฟังก์ชันคำนวณตำแหน่งดาวเทียมบนวงโคจรวงกลมง่ายๆ
// ปรับเปลี่ยนสูตรการโคจรให้ซับซ้อนขึ้นได้ เช่น วงรี, เอียง
const calculateSatellitePosition = (time, orbitRadius, orbitSpeed, orbitTiltRad) => {
    // กำหนดแกนโคจรหลัก (เช่น รอบแกน Y)
    const angle = (time * orbitSpeed) % (Math.PI * 2);

    // ตำแหน่งเริ่มต้นบนระนาบ XY
    let x = Math.cos(angle) * orbitRadius;
    let z = Math.sin(angle) * orbitRadius;
    let y = 0; // ในขั้นต้น y เป็น 0

    const position = new THREE.Vector3(x, y, z);

    // การเอียงวงโคจร (Orbit Tilt)
    // ใช้ Quaternion เพื่อหมุนตำแหน่งตามมุมเอียง
    const quaternion = new THREE.Quaternion();
    quaternion.setFromAxisAngle(new THREE.Vector3(1, 0, 0).normalize(), orbitTiltRad); // หมุนรอบแกน X เพื่อเอียงวงโคจร

    position.applyQuaternion(quaternion);

    return position;
};

export default function Satellite({ orbitRadius = 1.1, orbitSpeed = 0.05, orbitTiltDeg = 30 }) {
    const satelliteRef = useRef();
    const gltf = useLoader(GLTFLoader, '/models/satellite.glb'); // ตรวจสอบเส้นทางไฟล์โมเดลของคุณ
    const [satelliteScene, setSatelliteScene] = useState(null);

    // แปลงมุมเอียงจากองศาเป็นเรเดียน
    const orbitTiltRad = THREE.MathUtils.degToRad(orbitTiltDeg);

    // Clone scene เพื่อป้องกันการ modify scene เดียวกันซ้ำๆ หากมีหลายดาวเทียม
    useEffect(() => {
        if (gltf.scene) {
            setSatelliteScene(gltf.scene.clone());
        }
    }, [gltf]);

    useFrame(({ clock }) => {
        if (satelliteRef.current) {
            const time = clock.getElapsedTime();
            const newPosition = calculateSatellitePosition(time, orbitRadius, orbitSpeed, orbitTiltRad);
            satelliteRef.current.position.copy(newPosition);

            // ให้ดาวเทียมหันหน้าเข้าหาโลกเสมอ (หรือจะให้หันไปทิศทางอื่นก็ได้)
            satelliteRef.current.lookAt(0, 0, 0); // หันเข้าหาจุดศูนย์กลางโลก
            satelliteRef.current.rotation.y += Math.PI; // อาจต้องปรับการหมุนตามทิศทางโมเดลของคุณ
        }
    });

    if (!satelliteScene) {
        return null; // ยังไม่โหลดโมเดล
    }

    return (
        <group ref={satelliteRef}>
            <primitive object={satelliteScene} scale={0.01} /> {/* ปรับ scale ของดาวเทียมให้เหมาะสม */}
        </group>
    );
}