"""Original synthetic Morse timing examples. Python3 + matplotlib."""
from pathlib import Path
import csv,json
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
ROOT=Path(__file__).resolve().parent
cases=[('A',1,'Within a letter'),('ET',3,'Between letters'),('E T',7,'Between words')]
rows=[]
for text,gap,kind in cases:
    for state,start,duration,label in [(1,0,1,'dot'),(0,1,gap,kind),(1,1+gap,3,'dash')]:
        rows.append(dict(decoded_text=text,state=state,start_units=start,duration_units=duration,end_units=start+duration,role=label))
with (ROOT/'timing.csv').open('w',newline='',encoding='utf-8') as f:
    w=csv.DictWriter(f,fieldnames=list(rows[0]));w.writeheader();w.writerows(rows)
assert [1+g+3 for _,g,_ in cases]==[5,7,11]
meta={'status':'Synthetic ideal timing examples, not a captured signal','dot_duration_units':1,'dash_duration_units':3,'gap_units':{'within_letter':1,'between_letters':3,'between_words':7},'examples':[{'text':t,'gap_units':g,'duration_units':4+g} for t,g,_ in cases],'source':'https://www.itu.int/dms_pubrec/itu-r/rec/m/R-REC-M.1677-1-200910-I!!PDF-E.pdf','source_section':'Annex1 PartI section2; verified2026-09-27','limits':['No receiver noise, jitter, threshold or speed-estimation model.','The same dot-dash sequence with different gaps is a different timed signal.','Removing gap information creates ambiguity; intact ideal timing distinguishes these examples.','No trailing message gap is added to stated durations.']}
(ROOT/'study.json').write_text(json.dumps(meta,indent=2)+'\n',encoding='utf-8')
plt.rcParams.update({'font.family':'DejaVu Sans','font.size':11,'axes.spines.top':False,'axes.spines.right':False})
fig,axs=plt.subplots(3,1,figsize=(9,6),sharex=True,layout='constrained')
for ax,(text,gap,kind) in zip(axs,cases):
    ax.broken_barh([(0,1),(1+gap,3)],(.1,.7),facecolors='#285ec7')
    ax.annotate('',xy=(1+gap,.5),xytext=(1,.5),arrowprops={'arrowstyle':'<->','color':'#ad367f'})
    ax.text(1+gap/2,.87,f'{gap} unit'+('s' if gap>1 else '')+' silence',ha='center',color='#8a2461')
    ax.text(.5,.4,'dot',ha='center',color='white');ax.text(2.5+gap,.4,'dash',ha='center',color='white')
    ax.set(ylim=(0,1.25),yticks=[],title=f'{text}  |  {kind.lower()}');ax.grid(axis='x',alpha=.2);ax.set_axisbelow(True)
axs[-1].set(xlim=(-.2,11.2),xticks=range(12),xlabel='Time in dot-duration units')
fig.suptitle('Same short–long symbols, different separators',fontsize=16)
for ext in ('png','svg','pdf'):fig.savefig(ROOT/f'morse-separators.{ext}',dpi=180,bbox_inches='tight')
print('9 timing segments; checked total durations5,7,11 units.')
