#!/usr/bin/env python3
"""Run real station/candidate/preemption functions against deterministic SDK fakes."""
from pathlib import Path
import subprocess
import tempfile
from source_fragments import definition

repo = Path(__file__).resolve().parents[2]
source = (repo/'firmware/main/wifi_manager.cpp').read_text()
board = (repo/'boards/m5stack_stopwatch/board.cpp').read_text()
names = ['own_station_steady','own_candidate_owns','own_station_begin','own_station_resolve',
         'own_station_disconnected','own_station_idle','own_take_candidate','own_candidate_resolve',
         'own_forget_current','own_is_current','own_cancel_candidate_if_any',
         'set_state','wifi_status_task','wifi_manager_setup_blocked','populate_sta_config','current_ap_ssid','fail_candidate','apply_success',
         'connect_profile','station_task','handle_wifi_event','wait_station_disconnected',
         'validate_candidate','cancel_candidate_request','stop_provisioning_generation',
         'candidate_task','wifi_manager_stop_provisioning','wifi_manager_preempt_for_approval',
         'wifi_manager_test_candidate']
structs = ['CandidateRequest','TransitionGuard','PortalGuard','OwnGuard','Guard']
with tempfile.TemporaryDirectory(prefix='wifi-manager-') as folder:
    temp = Path(folder)
    (temp/'wifi_manager.inc').write_text(definition(board,'board_approval_pending')+'\n'+
                                       '\n'.join(definition(source,n,True) for n in structs)+
                                       '\n'+'\n'.join(definition(source,n) for n in names))
    subprocess.run(['c++','-std=c++17','-Wall','-Wextra','-Werror','-pthread',
                    '-I',str(temp),'-I',str(repo/'boards/common/include'),
                    str(repo/'firmware/tests/wifi_manager_test.cpp'),'-o',str(temp/'test')],check=True)
    subprocess.run([str(temp/'test')],check=True,timeout=30)
