"""Match the optical English arc coverage to the Japanese arc in selected M1."""
from math import atan2,degrees,radians
from graphics import *
from identity import reconstruct_mark,patch_mark,geometry,geometry_path,recolor
from round_patch import bilingual_patch,arc_name,checks

def arc_bounds(scene,role,side):
    angles=[]
    for item in scene.items:
        if item['role']!=role:continue
        g=geometry(item['d'],item['m'])
        for poly in ([g] if g.geom_type=='Polygon' else g.geoms):
            for x,y in poly.exterior.coords:angles.append(degrees(atan2(y-375,side*(x-375))))
    return min(angles),max(angles)

def main():
    f=fonts();mark=patch_mark(reconstruct_mark());original=bilingual_patch(f,mark)
    target=arc_bounds(original,'patch-japanese',1);target_span=target[1]-target[0]
    lo,hi=7,36
    for _ in range(17):
        tracking=(lo+hi)/2;s=Scene(750,750)
        arc_name(s,f['display'],radius=286,tracking=tracking,cap_height=56,small_height=41)
        a,b=arc_bounds(s,'patch-english',-1)
        if b-a<target_span:lo=tracking
        else:hi=tracking
    tracking=(lo+hi)/2
    rotation=radians((a+b)/2-(target[0]+target[1])/2)
    revised=bilingual_patch(f,mark,english={'radius':286,'tracking':tracking,'cap_height':56,'small_height':41,'rotation':rotation})
    # Preserve the pose while easing the figure inward enough to clear the lower-left text.
    inset=trans(375*(1-.98)+23,375*(1-.98),.98)
    for item in revised.items:
        if item['role'] not in ['body','foreground-curve','foot','red-head','black-head']:continue
        item['m']=mul(inset,item['m'])
        if item['role'] not in ['red-head','black-head']:
            item['d']=geometry_path(geometry(item['d'],item['m']).buffer(-.15,join_style='round'))
            item['m']=matrix()
    english=arc_bounds(revised,'patch-english',-1)
    report={'original_english_arc_degrees':arc_bounds(original,'patch-english',-1),'japanese_arc_degrees':target,'revised_english_arc_degrees':english,'english_tracking_units':round(tracking,4),'central_figure_scale_relative_to_M1':.98,'central_figure_shift_mm_at_75mm':2.3,'english_cap_height_mm_at_75mm':5.6,'the_cap_height_mm_at_75mm':4.1,**checks(revised)}
    assert max(abs(a-b) for a,b in zip(target,english))<.02,report
    assert report['minimum_text_to_emblem_gap_mm_at_75mm']>=1,report
    assert report['minimum_text_to_border_gap_mm_at_75mm']>=1,report
    assert report['minimum_independent_figure_gap_mm_at_75mm']>=1,report
    out=ROOT/'patches/balanced-circular';out.mkdir(exist_ok=True)
    ink_japanese=Scene(revised.w,revised.h,title='Stand The Fight | Balanced patch | Ink Japanese lettering')
    ink_japanese.add(revised)
    for item in revised.items:
        if item['role']=='patch-japanese':item['fill']=RED
    for mm in [75,90]:
        ink_japanese.export(out/f'stf-n1-balanced-patch-{mm}mm-colour-ink-japanese',png_width=1500,physical=(mm/25.4*72,mm/25.4*72))
        for kind in ['colour','black']:
            recolor(revised,kind).export(out/f'stf-n1-balanced-patch-{mm}mm-{kind}',png_width=1500,physical=(mm/25.4*72,mm/25.4*72))
    board=Scene(1700,1160,title='Stand The Fight | Balanced circular patch')
    board.rect(0,0,1700,1160,PAPER)
    f['medium'].text(board,'STAND THE FIGHT / CIRCULAR PATCH BALANCE',62,45,16,tracking=.035)
    f['body'].text(board,'SAME EMBLEM / MATCHED ARC COVERAGE',1638,45,12,align='right',fill=MUTED)
    board.line(62,94,1638,94,RULE)
    for name,s,x,heading,copy in [
        ('M1',original,60,'PREVIOUS / SHORTER ENGLISH ARC','The English occupied about 89 degrees; Japanese occupied about 113 degrees.'),
        ('N1',revised,890,'REFINED / BALANCED SIDES','Slightly larger English lettering and adjusted spacing now match the Japanese arc endpoints.')]:
        f['display'].text(board,name,x+18,140,48)
        board.add(s,x,218,.96)
        f['medium'].text(board,heading,x+18,990,15)
        f['body'].paragraph(board,copy,x+18,1033,690,18,29)
    board.export(out/'circular-patch-balance-comparison',png_width=1700,transparent=False)
    colour_board=Scene(1700,1160,title='Stand The Fight | Japanese lettering colour comparison')
    colour_board.rect(0,0,1700,1160,PAPER)
    f['medium'].text(colour_board,'STAND THE FIGHT / JAPANESE LETTERING COLOUR',62,45,16,tracking=.035)
    colour_board.line(62,94,1638,94,RULE)
    for scene,x,title in [(ink_japanese,60,'INK JAPANESE LETTERING'),(revised,890,'STF RED JAPANESE LETTERING')]:
        colour_board.add(scene,x,180,.96)
        f['medium'].text(colour_board,title,x+18,975,18)
    f['body'].paragraph(colour_board,'Both use the balanced N1 composition. The single-colour version uses black for both heads and all lettering.',78,1050,1490,20,30)
    colour_board.export(out/'japanese-lettering-colour-comparison',png_width=1700,transparent=False)
    (out/'spacing-review.json').write_text(json.dumps(report,indent=2)+'\n')
    print(json.dumps(report,indent=2))
    return revised,report

if __name__=='__main__':main()
