import random, time
import Vehicles, Logger

SCENARIOS = {
    0: 'Default',
    #1: 'Implicit Only',
    #2: 'Eye-contact Only',
    #3: 'Co-op Only',
    4: 'Full Communication',
    #5: 'Feign Distraction'
    6: 'Two-Way Communication'
}

SEEDS = [6318692483705895794,
         5223205262558462847,
         6198900097331845036,
         9781069571385401358,
         3500211275841570711,
         4566490100788299143,
         8024602167105987857,
         7033611572039637699,
         2710349884479068398,
         2486771541452719715]



def main():
    def communication():
            for scenario in SCENARIOS:
                ts0 = time.time()
                random.seed(seed) #Seed declaration has been moved inside the loop to ensure the seed is reset between loops (so the interactions are 1-to-1 comparable)
                fileName = fileIdentifier + '-' + intelligence + '-' + SCENARIOS.get(scenario) + '-' + str(int(interactionCount/1000)) + 'k.csv'

                print("Beginning simulation with Seed " + str(seed) + " ...")

                mainlineCars = Vehicles.generateVehicles(interactionCount, intelligence=intelligence, communicative=True, scenario=scenario)
                joiningCars = Vehicles.generateVehicles(interactionCount, intelligence=intelligence, position='Joining', communicative=True, scenario=scenario)

                print("Generating predefined assumptions ...")
                for i in range(interactionCount):
                    mainlineCars[i].setAssumptions(opponent=joiningCars[i], predefined=True)
                    joiningCars[i].setAssumptions(opponent=mainlineCars[i], predefined=True)
                print("Generation complete.")

                for i in range(interactionCount):
                    if i==0 or (i+1)%(reportingFrequency)==0:
                        print(""); print(f"=== Interaction {i+1} ==="); print("")

                    if scenario >= 6:
                         joiningCars[i].interact(mainlineCars[i])                       

                    mainlineCars[i].interact(joiningCars[i])
                    joiningCars[i].interact(mainlineCars[i])
                    mainlineCars[i].payoff, joiningCars[i].payoff = Vehicles.moveVehicles(M=mainlineCars[i], J=joiningCars[i], verbose=(i==0 or (i+1)%(reportingFrequency)==0))
                    if log:
                        Logger.writeToFile(fileName, i, mainlineCars[i], joiningCars[i], log_type='Game')
                
                tsf = time.time()
                print(f"Simulation for Scenario {scenario} completed successfully in {(tsf - ts0)/60} minutes.")



    t0 = time.time()
    interactionCount = 30000
    reportingFrequency = interactionCount/5
    intelligence = 'Mirror'
    #seed = 6318692483705895794 # Default seed
    #seed = 3456787321314567845
    gameMode = 'Communication'
    #fileIdentifier = 'VEHITSRanges-Final'
    log = True

    for seed in SEEDS:
        fileIdentifier = 'SpringerNature-PaperResults-Seed' + str(SEEDS.index(seed))
        #fileIdentifier = 'PairedTwoWay-Predefined-Seed' + str(SEEDS.index(seed))
        match gameMode:
            case 'Spatial':
                pass

            case 'Communication':
                communication()

    tf = time.time()

    print(f"Simulation suite completed successfully in {(tf - t0)/60} minutes.")
    print("Programme has ended.")

if __name__ == '__main__': main()
