// src/components/SatelliteOrbit.jsx
import { useMemo } from 'react';
import { Line } from '@react-three/drei';
import { Vector3, EllipseCurve, Path, BufferGeometry, LineBasicMaterial } from 'three';
import * as THREE from 'three';
//import { latLonToCartesian } from '../utils/threeHelpers';

/**
 * Component สำหรับแสดงเส้นทางวงโคจรของดาวเทียมรอบโลก
 *
 * @param {object} props
 * @param {number} props.altitude - ความสูงของวงโคจรจากผิวโลก (หน่วยเดียวกับรัศมีโลกใน Three.js, เช่น 1.001 สำหรับวงโคจรใกล้ผิว)
 * @param {number} props.inclination - มุมเอียงของวงโคจรเทียบกับระนาบศูนย์สูตร (หน่วยเป็นองศา)
 * @param {number} props.startLongitude - ลองจิจูดเริ่มต้นของจุดที่วงโคจรตัดกับเส้นศูนย์สูตร (หรือจุดอ้างอิง)
 * @param {string} [props.color='#00ffff'] - สีของเส้นวงโคจร (Cyan)
 * @param {number} [props.lineWidth=1] - ความหนาของเส้น
 * @param {number} [props.points=100] - จำนวนจุดที่ใช้สร้างเส้นวงโคจร (ยิ่งมากยิ่งเรียบ)
 */
export default function SatelliteOrbit({
                                           altitude = 1.05, // ค่า default สำหรับวงโคจรที่สูงขึ้นเล็กน้อย (จากรัศมีโลก 1)
                                           inclination = 45, // ตัวอย่าง: 45 องศา
                                           startLongitude = 0, // ตัวอย่าง: เริ่มที่ลองจิจูด 0
                                           color = '#00ffff', // Cyan
                                           lineWidth = 1,
                                           points = 100
                                       }) {
    const orbitPoints = useMemo(() => {
        const radius = altitude; // รัศมีวงโคจร (รัศมีโลก + ความสูง)
        const radInclination = THREE.MathUtils.degToRad(inclination); // แปลงมุมเอียงเป็นเรเดียน
        const radStartLongitude = THREE.MathUtils.degToRad(startLongitude); // แปลงลองจิจูดเริ่มต้นเป็นเรเดียน

        const orbit = [];
        for (let i = 0; i <= points; i++) {
            const angle = (i / points) * Math.PI * 2; // สร้างมุมตั้งแต่ 0 ถึง 2PI (รอบวงกลม)

            // คำนวณพิกัดบนวงโคจรในระนาบเอียง
            // อ้างอิงจาก https://math.stackexchange.com/questions/292850/how-to-calculate-coordinates-on-an-inclined-orbit
            const x = radius * (Math.cos(angle) * Math.cos(radStartLongitude) - Math.sin(angle) * Math.sin(radStartLongitude) * Math.cos(radInclination));
            const y = radius * (Math.sin(angle) * Math.cos(radInclination)); // Y-axis is usually up in Three.js
            const z = radius * (Math.cos(angle) * Math.sin(radStartLongitude) + Math.sin(angle) * Math.cos(radStartLongitude) * Math.cos(radInclination));

            // Note: ต้องระวังเรื่องแกนใน Three.js (Y-up) กับสูตรทางคณิตศาสตร์ (Z-up)
            // สูตรข้างต้นจะให้วงโคจรอยู่ในระนาบ XY โดยมี Z เป็นแกน Normal
            // เราต้องหมุนหรือปรับแกนให้เข้ากับ Three.js (Y-up)

            // วิธีที่ง่ายกว่าคือสร้างวงกลมในระนาบ XY แล้วหมุนทั้งวง
            const orbitVector = new Vector3(radius * Math.cos(angle), 0, radius * Math.sin(angle));

            // หมุนรอบแกน Z (yaw) เพื่อให้ได้ startLongitude
            orbitVector.applyAxisAngle(new Vector3(0, 1, 0), radStartLongitude); // หมุนรอบแกน Y (longitude)

            // หมุนรอบแกน X (pitch) เพื่อให้ได้ inclination
            orbitVector.applyAxisAngle(new Vector3(1, 0, 0), radInclination); // หมุนรอบแกน X (inclination)

            orbit.push(orbitVector);
        }
        return orbit;
    }, [altitude, inclination, startLongitude, points]);

    return (
        <Line
            points={orbitPoints}
            color={color}
            lineWidth={lineWidth}
            dashed={false}
        />
    );
}