class Default:
    def __init__(self, params={}):
        self.params = params
        self.set_defaults()

    def set_defaults(self):
        self.params.setdefault( 'xlims', (-600.0, 600.0) )
        self.params.setdefault( 'ylims', (-600.0, 600.0) )
        self.params.setdefault( 'zlims', (0, 120) )
        self.params.setdefault( 'res', 25 )

        self.params.setdefault( 'dt', 1 ) # dt for searcher motion
        self.params.setdefault( 'T', 50 )

        self.params.setdefault( 'iter_steps', int(self.params['T']/self.params['dt']) )
        self.params.setdefault( 'num_iter', 10 )    #change from 300

        self.params.setdefault( 'num_humans', 1 )

        ##############################
        self.params.setdefault( 'num_searchers', 2 )
        self.params.setdefault( 'num_robots', 2)
        ##############################

        self.params.setdefault( 'max_plan_nodes', 5) #change from 100
        self.params.setdefault( 'terrainType', 'real')
        self.params.setdefault( 'save_terrain', False)
        self.params.setdefault( 'save_MCdata', False)
        self.params.setdefault( 'load_MCdata', False)
        self.params.setdefault( 'store_logs', False)
        self.params.setdefault( 'random_pos', True)
        self.params.setdefault( 'random_motion_init', True)

        # params.update({'obstacles': [infcyl1,
        #     # infcyl2, \
        #     # sphere1, \
        #     # sphere2, \
        #     # infcyl3, \
        #     # infcyl4, \
        #     # infcyl5, \
        #     infcyl6 \
        #     ]})
        # params.update({'obstacles': [infcyl1, infcyl6]})

        '''
        additions to original codebase
        '''
        # searcher path parameters
        self.params.setdefault('sweep_num', 3)  # for grouped method
        self.params.setdefault('search_method', 'grouped' ) # 'sweep' or 'grouped'
        self.params.setdefault('searcher_path_num', 200 ) # number of points for ind. searcher path

        # gis/run paramters
        self.params.setdefault('anchor_point', [36.891640, -81.524214]) # hmpark
        # self.params.setdefault('anchor_point', [37.197730, -80.585233]) # kentland
        # self.params.setdefault('anchor_point', [36.660460, -81.543921]) # grayson
        self.params.setdefault('heading', 0)  # direction of trajectories from mag north
        self.params.setdefault('stats_name', 'kentland') # saves risk-cost and waypoint related data in json upon finishing


        # drone path parameters
        self.params.setdefault('planning_min_height', 15)  # min meters above terrain to plan with
        self.params.setdefault('planning_max_height', 30)  # max meters above terrain to plan with
        self.params.setdefault('path_style', 'rc')  # 'sweep' for lawn mower, 'basic' for optimized, or 'rc' for above searchers
        self.params.setdefault('drone_sweeps', 4)  # number of path 'ticks' for sweep method of path planning
        self.params.setdefault('sweep_height', 20)  # height above terrain used during sweeps
        self.params.setdefault('path_interp_res', 75) # resolution to interpolate drone paths to (total number of points)
        self.params.setdefault('total_path_len', 1500) # max length of naive case path length

        # optimization parameters
        self.params.setdefault('opt_iterations', 1)  # iterations to optimize drone paths (default was 500)
        self.params.setdefault('learning_rate', 3)  # learning rate for adam
        self.params.setdefault('weight_decay', 5e-3)  # weight decay (l2 penalty)
        self.params.setdefault('test_fraction', 0.10)  # percentage of test points in batch
        self.params.setdefault('train_fraction', 0.90)  # percentage of train points in batch


        # lost person model parameters
        self.params.setdefault('lp_model', 'custom') # options: 'custom', 'naive', 'ring'
        #self.params.setdefault('lp_filename', 'C:\\Users\\Larkin\\planning_llh_bgc\\LP model\\analysis\\outputs\\ic_1_con_hiker_t12_kentland.csv') # filename to load for heatmap data
        self.params.setdefault('lp_filename', './LP model/analysis/outputs/ic_1_con_hiker_t12_kentland.csv') # filename to load for heatmap data
        # should make sure the heatmap file used is derived from the correct BWLF mat file
        self.params.setdefault('lin_feat_filename', '../ags_grabber/matlab_data/BW_LFandInac_Zelev_kentland.mat') # filename used for linear features/inac
        self.params.setdefault('ring_mobi', [0.6e3, 1.8e3, 3.2e3, 9.9e3]) # mobility for ring model heatmap
        self.params.setdefault('lp_threshold', 0.2) # hotspot cutoff threshold on normalized heatmap (ind values in 0-1)
        self.params.setdefault('t_to_f_iter', 5000) # number of iterations to settle on time to find
        # self.params.setdefault('drone_fov_radius', 5) # radius at which drone can detect lost person (scales with altitude, x=0 intercept)
        self.params.setdefault('drone_fov_alt', 0.463647) # altitude at which drone sensing radius increases by 2 (slope of fov cone)
        self.params.setdefault('searcher_fov_radius', 10) # radius at which searcher can detect lost person
        self.params.setdefault('drone_speed', 8) # in units of m per second
        self.params.setdefault('searcher_speed', 1.4) # in units of m per second


        # data parameters
        self.params.setdefault('plot_data', True) # plots data in plotly viewer upon finishing
        self.params.setdefault('save_data', False) # saves risk-cost and waypoint related data in json upon finishing
        self.params.setdefault('save_folder', 'howell_test') # which folder to save data in