"""Also export the eclipse-day post-totality Sun track.

It does not go on the chart -- see the residual below -- but the page cites
numbers from it, and a number the repository cannot rebuild is not a number.
"""
import pickle
import sys
from datetime import datetime, timedelta

import numpy as np

sys.path.insert(0, '/root/repos/globe-deconstruction/scripts')
import mcgarry_measured_vs_model as M      # noqa: E402

OUT = ('/root/repos/globe-deconstruction/docs/eclipse-trajectory/data/'
       'erie-eclipse-day-pixels.csv')


def metrics(q):
    a = np.array(q, float)
    devs = []
    for k in range(1, len(a) - 1):
        i0, i1, i2 = a[k - 1, 0], a[k, 0], a[k + 1, 0]
        if i2 == i0:
            continue
        f = (i1 - i0) / (i2 - i0)
        devs.append(np.hypot(a[k, 1] - (a[k - 1, 1] + (a[k + 1, 1] - a[k - 1, 1]) * f),
                             a[k, 2] - (a[k - 1, 2] + (a[k + 1, 2] - a[k - 1, 2]) * f)))
    return len(q) / (a[-1, 0] - a[0, 0] + 1), float(np.median(devs)) if devs else 999.0


def main():
    d = pickle.load(open('/root/work/apr_tracks2.pkl', 'rb'))
    A, B = d['A'], d['B']
    c = pickle.load(open('/root/work/apr8_cands.pkl', 'rb'))
    tv = np.array([o['t_video'] for o in c])
    good = [q for q in d['tracks'] if metrics(q)[1] < 4.0 and metrics(q)[0] > 0.35]
    pick = None
    for q in good:
        raw = A + B * tv[np.array(q, float)[:, 0].astype(int)]
        if raw.min() > 1440 + 12 * 60:            # 8 April, afternoon
            pick = q
    assert pick is not None
    a = np.array(pick, float)
    raw = A + B * tv[a[:, 0].astype(int)]
    base = datetime(2024, 4, 7)
    with open(OUT, 'w') as fh:
        fh.write('frame,raw_stamp_edt,body,pixel_x,pixel_y,blob_px\n')
        for k in range(len(a)):
            st = base + timedelta(minutes=float(raw[k]))
            fh.write(f'{int(a[k, 0])},{st.isoformat(timespec="seconds")},sun,'
                     f'{a[k, 1]:.2f},{a[k, 2]:.2f},{int(a[k, 3])}\n')
    print(f'wrote {OUT}  {len(a)} rows')
    print(f'  camera clock {(raw.min() - 1440) // 60:.0f}:{(raw.min() - 1440) % 60:04.1f}'
          f' to {(raw.max() - 1440) // 60:.0f}:{(raw.max() - 1440) % 60:04.1f} on 8 April')


if __name__ == '__main__':
    main()
