#!/usr/bin/env python
"""
Usage: ./modify_run_list.py input_run_list.txt output_run_list.txt

All the *_run_list.txt files are JSON suitable for input to submit_run_list.py.

You must manually modify main() to create a desired scenario.
The main goal was to take an existing scenario and do common things
like:
 - update notes
 - increase/decrease all power levels
 - do the same run multiple times, but with different firmware
"""
import json
import sys
import copy
import os

def update_power(run_list,inc_power):
    """In/Out: run_list = from JSON data['run_list']
       In:     inc_power = add this to every 'pwr' > -900
    """
    n_updates = 0
    for run in run_list:
        for jam in run['jammer_list'].values():
            if 'pwr' in jam:
                int_pwr = int(jam['pwr'])
                if int_pwr > -900:
                    jam['pwr'] = str(int_pwr + inc_power)
                    n_updates += 1
            if 'schedule' in jam:
                for sched in jam['schedule']:
                    int_pwr = int(sched['pwr'])
                    if int_pwr > -900:
                        sched['pwr'] = str(int_pwr + inc_power)
                        n_updates += 1
    print("update power %d: %s"%(n_updates,run_list[0]['notes']))

def update_notes(run_list,txt_old,txt_new):
    """In/Out: run_list = from JSON data['run_list']
       Replace 'txt_old' with 'txt_new' in all run list 'notes'
    """
    for run in run_list:
        run['notes'] = run['notes'].replace(txt_old,txt_new)

def install_fw( run_list, rcvr_list, timg_filename ):
    """In/Out: run_list = from JSON data['run_list']
       For every receiver in 'rcvr_list' (e.g. ['1']), install 'timg_filename'
       in the first scenario in 'run_list'
    """
    if not os.path.isfile(timg_filename):
        raise RuntimeError("Missing timg",timg_filename)
    for rcvr in rcvr_list:
        run_list[0]['receiver_list'][rcvr]['install_timg'] = True
        run_list[0]['receiver_list'][rcvr]['timg_path'] = timg_filename
        print("install FW %s"%(run_list[0]['notes']))

def main(filename,filename_out):
    """filename = reference run list to change
       filename_out = modified run list
    """
    with open(filename) as f_in:
        data = json.loads(f_in.read())

    print("Common operations:")
    update_power(data['run_list'],5)

    print("Unique operations:")
    base_path = "/home/ddelore/Documents/timg_files/auger_titan_2023_0427/"
    run_list_a = copy.deepcopy(data['run_list'])
    run_list_b = copy.deepcopy(data['run_list'])
    run_list_c = copy.deepcopy(data['run_list'])
    update_notes( run_list_a, 'S13 and S16','baseline' )
    install_fw( run_list_a, '1', base_path+"auger_titan_no1_04.timg" )

    update_notes( run_list_b, 'S13 and S16','S13 and S16' )
    install_fw( run_list_b, '1', base_path+"auger_titan_no1_04_s13s16.timg" )

    update_notes( run_list_c, 'S13 and S16','S16 and S19' )
    install_fw( run_list_c, '1', base_path+"auger_titan_no1_04_s16s19.timg" )

    data['run_list'] = run_list_a + run_list_b + run_list_c
    with open(filename_out,'w') as f_out:
        print(json.dumps(data,indent=2),file=f_out)

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print(__doc__)
    else:
        file_in = sys.argv[1]
        file_out = sys.argv[2]
        main(file_in,file_out)
