// 📃 ./examples/basic_usage.rs

use cad_cs::libs::cs::abstracts::{
	//AbstractHelperCs2, // Jeśli używasz .print()
	AbstractHelperCs3, // Jeśli używasz .print()
	AbstractMathCs2,
	AbstractMathCs3,
};
use cad_cs::{
	cs,
	dms,
	libs::{
		angle::AngleFmt,
		cs::{
			Cs2,
			Cs3,
			model::{CoordsPolar, CoordsSpherical},
		},
	},
};

fn main() {
	// 📚 [POL]: Inicjalizacja demonstracji API biblioteki cad-cs.
	// 📚 [ENG]: Initialization of the cad-cs library API demonstration.
	println!("🚀 cad-cs API demonstration\n");

	// =================================================================
	// 1. MACRO INITIALIZATION (cs!)
	// =================================================================

	let pt_2d = cs![3.0, 4.0];
	let pt_3d = cs![3.0, 4.0, 12.0];

	println!("🔷 2D Cartesian: {:?}", pt_2d);
	println!("🔶 3D Cartesian: {:?}", pt_3d);

	// 📚 [POL]: Bezpośrednie wywołania metod algebraicznych jądra.
	// 📚 [ENG]: Direct calls to the kernel's algebraic methods.
	println!("📏 rxy (2D radius): {}", pt_2d.rxy());
	println!("📏 rxyz (3D full radius): {}", pt_3d.rxyz());
	println!("📐 arctan_y_x (2D azimuth): {:.4} rad", pt_2d.arctan_y_x());

	println!("\n----------------------------------------------------\n");

	// =================================================================
	// 2. DOMAIN TRANSFER OBJECTS (DTO) CONVERSIONS
	// =================================================================

	// 📚 [POL]: Konwersja układu biegunowego (R, Φ) na kartezjański wektor Cs2.
	// 📚 [ENG]: Conversion of polar system (R, Φ) to Cartesian Cs2 vector.
	let punkt_z_biegunowego: Cs2 = CoordsPolar {
		r_d2: 10.0,
		f_y_x: std::f64::consts::PI / 2.0, // 90° (Y-axis)
	}
	.into();

	println!("🟪 Cs2 from polar (R=10, Φ=90°): {:?}", punkt_z_biegunowego);

	// 📚 [POL]: Konwersja układu sferycznego (R, Φ, Θ) na kartezjański wektor Cs3.
	// 📚 [ENG]: Conversion of spherical system (R, Φ, Θ) to Cartesian Cs3 vector.
	let punkt_ze_sferycznego: Cs3 = CoordsSpherical {
		r_d3: 20.0,
		f_y_x: 0.0,                        // X-axis azimuth
		t_z_r: std::f64::consts::PI / 4.0, // 45° inclination from Z-axis
	}
	.into();

	println!("🟫 Cs3 from spherical (R=20, Φ=0°, Θ=45°): {:?}", punkt_ze_sferycznego);

	println!("\n----------------------------------------------------\n");

	// =================================================================
	// 3. GEODETIC CONVERSIONS (DMS / ECEF)
	// =================================================================

	// 📚 [POL]: Wektor 2D zawierający szerokość i długość geograficzną wygenerowaną makrem dms!.
	// 📚 [ENG]: 2D vector containing latitude and longitude generated by the dms! macro.
	let stawowa2 = cs![dms!(50, 14, 56.3), dms!(19, 8, 2.3)];

	// 📚 [POL]: Średni promień Ziemi w metrach (model sferyczny).
	// 📚 [ENG]: Mean Earth radius in meters (spherical model).
	let r_ziemi = 6_371_000.0;

	// 📚 [POL]: Transformacja współrzędnych sferycznych do przestrzeni kartezjańskiej ECEF.
	// 📚 [ENG]: Transformation of spherical coordinates to Cartesian ECEF space.
	let stawowa_xyz = stawowa2.to_ecef_from_rad_sn_we(r_ziemi);

	println!("🌐 Radian input (Lat, Lon): {:?}", stawowa2);

	// 📚 [POL]: Wywołanie warstwy diagnostycznej (helper).
	// 📚 [ENG]: Invocation of the diagnostic layer (helper).
	stawowa_xyz.print("stawowa_xyz", AngleFmt::Deg);
	stawowa_xyz.print_dms_sn_we("stawowa_xyz_dms");

	println!("📍 Location relative to Earth's core (meters):");
	println!("   X: {:.2} m", stawowa_xyz[0]);
	println!("   Y: {:.2} m", stawowa_xyz[1]);
	println!("   Z: {:.2} m", stawowa_xyz[2]);
	println!("📏 Distance from core (validation): {:.2} m", stawowa_xyz.rxyz());

	// 📚 [POL]: Operacja odwrotna (Dekompresja) ECEF -> DMS.
	// 📚 [ENG]: Inverse operation (Decompression) ECEF -> DMS.
	let z_powrotem_na_powierzchnie = stawowa_xyz.to_dms_sn_we_from_xyz();
	println!("🔄 Back to DMS: {:?}", z_powrotem_na_powierzchnie);
}
