import time

class analytics():
    def __init__(self, **kwargs):
        return

    #######################
    # time used functions
    #######################

    def make_analytics_dict(self):
        print("Do analytics")

        analytics_dict = {}

        if self.grid_options['do_analytics']:
            # Put all interesting stuff in a variable and output that afterwards, as analytics of the run.
            analytics_dict = {
                "population_id": self.grid_options["_population_id"],
                "evolution_type": self.grid_options["evolution_type"],
                "failed_count": self.grid_options["_failed_count"],
                "failed_prob": self.grid_options["_failed_prob"],
                "failed_systems_error_codes": self.grid_options[
                    "_failed_systems_error_codes"
                ].copy(),
                "errors_exceeded": self.grid_options["_errors_exceeded"],
                "errors_found": self.grid_options["_errors_found"],
                "total_probability": self.grid_options["_probtot"],
                "total_count": self.grid_options["_count"],
                "start_timestamp": self.grid_options["_start_time_evolution"],
                "end_timestamp": self.grid_options["_end_time_evolution"],
                "time_elapsed" : self.time_elapsed(),
                "total_mass_run": self.grid_options["_total_mass_run"],
                "total_probability_weighted_mass_run": self.grid_options[
                    "_total_probability_weighted_mass_run"
                ],
                "zero_prob_stars_skipped": self.grid_options["_zero_prob_stars_skipped"],
            }

        if "metadata" in self.grid_ensemble_results:
            # Add analytics dict to the metadata too:
            self.grid_ensemble_results["metadata"].update(analytics_dict)
            self.add_system_metadata()
        else:
            # use existing analytics dict
            try:
                analytics_dict = self.grid_ensemble_results["metadata"]
            except:
                analytics_dict = {} # should never happen

        return analytics_dict

    def set_time(self,when):
        """
        Function to set the timestamp at when, where when is 'start' or 'end'.

        If when == end, we also calculate the time elapsed.
        """
        self.grid_options['_' + when + '_time_evolution'] = time.time()
        if when == 'end':
            self.grid_options["_time_elapsed"] = self.time_elapsed(force=True)

    def time_elapsed(self,force=False):
        """
        Function to return how long a population object has been running.

        We return the cached value if it's available, and calculate
        the time elapsed if otherwise or if force is True
        """
        for x in ["_start_time_evolution","_end_time_evolution"]:
            if not self.grid_options[x]:
                self.grid_options[x] = time.time()
                print("{} missing : {}".format(x,self.grid_options[x]))

        if force or "_time_elapsed" not in self.grid_options:
            self.grid_options["_time_elapsed"] = self.grid_options["_end_time_evolution"] - self.grid_options["_start_time_evolution"]
            print("set time elapsed = {} - {} = {}".format(
                self.grid_options["_end_time_evolution"],
                self.grid_options["_start_time_evolution"],
                self.grid_options["_time_elapsed"],
            ))

        return self.grid_options["_time_elapsed"]

    def CPU_time(self):
        """
        Function to return how much CPU time we've used
        """
        dt = self.grid_options["_time_elapsed"]
        try:
            ncpus = self.grid_options['num_processes']
        except:
            ncpus = 1
        print("CPU time : dt={} n={} -> {}".format(
            dt,
            ncpus,
            dt*ncpus))
        return dt * ncpus