package jupiter

import (
	"time"

	"b612.me/astro/basic"
)

// PhysicalInfo 木星物理观测参数 / physical observing parameters of Jupiter.
type PhysicalInfo struct {
	// SubEarthLongitude 子地经度，单位度；采用 Jupiter 当前 IAU/Horizons 西经为正约定。
	SubEarthLongitude float64
	// SubEarthLatitude 子地纬度，单位度。
	SubEarthLatitude float64
	// SubSolarLongitude 子日经度，单位度；采用 Jupiter 当前 IAU/Horizons 西经为正约定。
	SubSolarLongitude float64
	// SubSolarLatitude 子日纬度，单位度。
	SubSolarLatitude float64
	// NorthPolePositionAngle 木星北极位置角，单位度。
	NorthPolePositionAngle float64
	// DS 太阳相对木星赤道的行星中心赤纬，单位度。
	DS float64
	// DE 地球相对木星赤道的行星中心赤纬，单位度。
	DE float64
	// CentralMeridianSystemI 木星 System I 照亮盘中央经线，单位度，西经为正。
	CentralMeridianSystemI float64
	// CentralMeridianSystemII 木星 System II 照亮盘中央经线，单位度，西经为正。
	CentralMeridianSystemII float64
	// CentralMeridianSystemIII 木星 System III 盘面中央经线，单位度，西经为正。
	CentralMeridianSystemIII float64
}

// CentralMeridianInfo 木星 System I/II/III 中央经线 / Jupiter System I/II/III central meridians.
type CentralMeridianInfo struct {
	// SystemI 木星 System I 照亮盘中央经线，单位度，西经为正。
	SystemI float64
	// SystemII 木星 System II 照亮盘中央经线，单位度，西经为正。
	SystemII float64
	// SystemIII 木星 System III 盘面中央经线，单位度，西经为正。
	SystemIII float64
}

// Physical 木星物理观测参数 / physical observing parameters of Jupiter.
func Physical(date time.Time) PhysicalInfo {
	return PhysicalN(date, -1)
}

// PhysicalN 木星物理观测参数（截断版） / truncated physical observing parameters of Jupiter.
func PhysicalN(date time.Time, n int) PhysicalInfo {
	jde := basic.Date2JDE(date.UTC())
	jd := basic.TD2UT(jde, true)
	info := basic.JupiterPhysicalN(jd, n)
	meridians := basic.JupiterCentralMeridiansN(jd, n)
	ds, de := basic.JupiterDSDEN(jd, n)
	return PhysicalInfo{
		SubEarthLongitude:        info.SubEarthLongitude,
		SubEarthLatitude:         info.SubEarthLatitude,
		SubSolarLongitude:        info.SubSolarLongitude,
		SubSolarLatitude:         info.SubSolarLatitude,
		NorthPolePositionAngle:   info.NorthPolePositionAngle,
		DS:                       ds,
		DE:                       de,
		CentralMeridianSystemI:   meridians.SystemI,
		CentralMeridianSystemII:  meridians.SystemII,
		CentralMeridianSystemIII: meridians.SystemIII,
	}
}

// CentralMeridians 木星 System I/II/III 中央经线 / Jupiter System I/II/III central meridians.
func CentralMeridians(date time.Time) CentralMeridianInfo {
	return CentralMeridiansN(date, -1)
}

// CentralMeridiansN 木星 System I/II/III 中央经线（截断版） / truncated Jupiter System I/II/III central meridians.
func CentralMeridiansN(date time.Time, n int) CentralMeridianInfo {
	jde := basic.Date2JDE(date.UTC())
	info := basic.JupiterCentralMeridiansN(basic.TD2UT(jde, true), n)
	return CentralMeridianInfo{
		SystemI:   info.SystemI,
		SystemII:  info.SystemII,
		SystemIII: info.SystemIII,
	}
}
