"""Educational ellipse geometry, a=1. Not observational data or an orbit fit."""
import csv
import argparse
from pathlib import Path
from math import sqrt
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
matplotlib.rcParams['svg.hashsalt'] = 'nebosvod-orbit-shapes-v1'

parser = argparse.ArgumentParser(description='Учебная геометрия эллипсов; требуется matplotlib.')
parser.add_argument('--output-dir', type=Path, default=Path('orbit-shapes'))
root = parser.parse_args().output_dir
root.mkdir(parents=True, exist_ok=True)
with (root/'orbit-shapes.csv').open('w',newline='') as file:
    writer=csv.writer(file,lineterminator='\n');writer.writerow(['eccentricity','semi_major_axis','semi_minor_axis','periapsis','apoapsis'])
    for i in range(20):
        e=i/20;writer.writerow([e,1,round(sqrt(1-e*e),8),round(1-e,8),round(1+e,8)])
fig, axes=plt.subplots(1,4,figsize=(12,3.8))
fig.subplots_adjust(left=.045,right=.99,bottom=.15,top=.79,wspace=.16)
fig.set_facecolor('#f5f0e6')
angles=np.linspace(0,2*np.pi,600)
for axis,e in zip(axes,[0,.3,.6,.9]):
    b=sqrt(1-e*e)
    axis.set_facecolor('#f5f0e6');axis.plot(np.cos(angles),b*np.sin(angles),color='#086278',linewidth=2)
    axis.scatter([e],[0],color='#c48119',s=45,zorder=3);axis.plot([-1,1],[0,0],color='#92959d',linewidth=.7)
    axis.set_title(f'e = {e:g}',fontsize=14);axis.set_aspect('equal');axis.set_xlim(-1.15,1.15);axis.set_ylim(-1.15,1.15)
    axis.set_xticks([-1,0,1]);axis.set_yticks([-1,0,1]);axis.tick_params(labelsize=9)
    axis.set_xlabel(f'rp = {1-e:.1f}; ra = {1+e:.1f}')
fig.suptitle('Эллипсы: a = 1, золотая точка — фокус',fontsize=16)
fig.savefig(root/'orbit-shapes.svg',bbox_inches='tight',pad_inches=.12,metadata={'Date':None,'Title':'Учебная геометрия эллипсов с a=1','Description':'Четыре эллипса e=0; 0,3; 0,6; 0,9. Золотая точка — фокус. Масштаб осей одинаковый.'})
svg = root/'orbit-shapes.svg'
svg.write_text('\n'.join(line.rstrip() for line in svg.read_text().splitlines())+'\n')
plt.close(fig)
print('Generated CSV and SVG from ellipse equations')
