#!/usr/bin/env python3

import json
import locale
import sys
import emails
import os

from reportlab.platypus import SimpleDocTemplate
from reportlab.platypus import Paragraph, Spacer, Table, Image
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib import colors


def load_data(filename):
  """Loads the contents of filename as a JSON file."""
  with open(filename) as json_file:
    data = json.load(json_file)
  return data


def format_car(car):
  """Given a car dictionary, returns a nicely formatted name."""
  return "{} {} ({})".format(
      car["car_make"], car["car_model"], car["car_year"])


def process_data(data):
  """Analyzes the data, looking for maximums.

  Returns a list of lines that summarize the information.
  """
  locale.setlocale(locale.LC_ALL, 'en_US.UTF8')
  max_revenue = {"revenue": 0}

  max_sales = 0
  max_sales_model = ""


  year_wise_sales = {}
  most_popular_year = 0
  most_popular_year_sales = 0

  for item in data:
    # Calculate the revenue generated by this model (price * total_sales)
    # We need to convert the price from "$1234.56" to 1234.56
    item_price = locale.atof(item["price"].strip("$"))
    item_revenue = item["total_sales"] * item_price
    if item_revenue > max_revenue["revenue"]:
      item["revenue"] = item_revenue
      max_revenue = item
    # TODO: also handle max sales

    if item["total_sales"] > max_sales:
      max_sales = item["total_sales"]
      max_sales_model = item["car"]["car_make"] + " " + item["car"]["car_model"]  


    # TODO: also handle most popular car_year
    if item["car"]["car_year"] not in year_wise_sales.keys():
        year_wise_sales[item["car"]["car_year"]] = item["total_sales"]
    else:
        year_wise_sales[item["car"]["car_year"]] += item["total_sales"]

    year_wise_sales = {k: v for k, v in sorted(year_wise_sales.items(), key=lambda item: item[1], reverse=True)}

    most_popular_year = next(iter(year_wise_sales))
    most_popular_year_sales = year_wise_sales[most_popular_year] 

  summary = [
    "The {} generated the most revenue: ${}".format(
      format_car(max_revenue["car"]), max_revenue["revenue"]),
    
    "The {} had the most sales: {}".format(max_sales_model, max_sales),

    "The most popular year was {} with {} sales.".format(most_popular_year, most_popular_year_sales)

  ]

  return summary

def cars_dict_to_table(car_data):
  """Turns the data in car_data into a list of lists."""
  table_data = [["ID", "Car", "Price", "Total Sales"]]
  for item in car_data:
    table_data.append([item["id"], format_car(item["car"]), item["price"], item["total_sales"]])
  return table_data


def main(argv):
  """Process the JSON data and generate a full report out of it."""
  data = load_data("car_sales.json")
  summary = process_data(data)
  print(summary)
#   print(cars_dict_to_table(data))
  
  # TODO: turn this into a PDF report
  styles = getSampleStyleSheet()
  report = SimpleDocTemplate("/tmp/cars.pdf")  # path changed for submission
  report_title = Paragraph("Sales summary for last month", styles["h1"])

  report_summary1 = Paragraph(summary[0]+"<br/>", styles["BodyText"])
  report_summary2 = Paragraph(summary[1]+"<br/>", styles["BodyText"])
  report_summary3 = Paragraph(summary[2]+"<br/><br/>", styles["BodyText"])


  table_style = [('GRID', (0,0), (-1,-1), 1, colors.black)]

  report_table = Table(data=cars_dict_to_table(data), style=table_style, hAlign="LEFT")

  report.build([report_title, report_summary1, report_summary2, report_summary3, report_table])

 

  # TODO: send the PDF report as an email attachment
  sender = "<EMAIL>"
  receiver = <EMAIL>".<EMAIL>(os.environ.get('USER'))
  subject = "Sales summary for last month"
  body = summary[0] + "\n" + summary[1] + "\n" + summary[2] + "\n"
  message = emails.generate(sender, receiver, subject, body, "/tmp/cars.pdf") # path changed for submission
  emails.send(message)

if __name__ == "__main__":
  main(sys.argv)


