from inspect import currentframe, getframeinfo, stack
from datetime import datetime
from pprint import pprint
import sys
import os

def init_timer(outputfile="execution_time.txt"):
  file = open(outputfile, "a")
  start_time = datetime.now()
  caller = getframeinfo(stack()[1][0])
  line_num = str(caller.lineno)
  filename = str(caller.filename)
  file.write(f"Debug for: {filename}\n")
  run_info = {
    "output_file": file,
    "last_check_time": start_time,
    "last_check_line": line_num
  }
  return run_info

def lap_timer(run_info):
  curr_time = datetime.now()
  caller = getframeinfo(stack()[1][0])
  line_num = str(caller.lineno)
  run_info['output_file'].write(
    f"lines {run_info['last_check_line']}-{line_num}: {(curr_time - run_info['last_check_time']).total_seconds()} seconds\n"
  )

  run_info['last_check_time'] = curr_time
  run_info['last_check_line'] = line_num
  run_info['output_file'].flush()
  os.fsync(run_info['output_file'].fileno())

  return run_info

def close_timer(run_info):
  run_info['output_file'].close()

# Prints line numbers with the highest runtime
if __name__ == '__main__':
  in_file = "execution_time.txt"
  if len(sys.argv) > 1:
    in_file = sys.argv[1]

  with open(in_file) as f:
    current_chunk = []
    for line in f:
      if "lines" != line[:5]:
        pprint( sorted(current_chunk, key=lambda x: float(x.split(' ')[2]))[::-1] )
        current_chunk = []
      else:
        idxs = [i for i in range(len(current_chunk)) if current_chunk[i].split(' ')[1] == line.split(' ')[1]]
        if len(idxs) > 0:
          row = current_chunk[idxs[0]]
          new_time = float(row.split(' ')[2]) + float(line.split(' ')[2])
          new_str = ' '.join([row.split(' ')[0], row.split(' ')[1], str(new_time), row.split(' ')[3]])
          current_chunk[idxs[0]] = new_str
        else:
          current_chunk.append(str(line))
    pprint( sorted(current_chunk, key=lambda x: float(x.split(' ')[2]))[::-1] )
