#!/usr/bin/python
# -*- coding: utf8 -*-
# -*- Mode: Python; py-indent-offset: 4 -*-
"""
    Utils that let us send message over socket.

    usage:
        timevortex-logextracter
            ../timevortex.data/timevortex-currentcost.log.2014-10-17
            ../timevortex.data/extracted/

"""
import argparse
import serial
import os
from time import sleep, clock
import logging
import logging.config
import json
from currentcost.utils import data_validator, get_currentcost_message
from datetime import datetime, timedelta
from filestorage.db import FileStorage
from sys import stdout

DEFAULT_LOG_FILE = "logs/test.conf"
logging.config.fileConfig(DEFAULT_LOG_FILE)
LOGGER = logging.getLogger("currentcost")
RAW_FILE = "timevortex-currentcost.tsv"


def argument_parser():
    """Method that parse arguments from command line, return an error in
    case of missing parameter or return arguments with their value.

    :returns:  dict -- Dict containing arguments.

    """
    # Get command line arguments
    parser = argparse.ArgumentParser()
    # Define expected arguments
    parser.add_argument("log_file", help="Path to log file to parse")
    parser.add_argument("folder", help="Path to store TSV file")
    # Return list of argument passed in command line
    return parser.parse_args()


def main():
    """
        Main function of this module.
    """
    args = argument_parser()
    log_file = args.log_file
    folder = args.folder
    file_storage_space = FileStorage(folder)
    timeseries_args = {
        "ch1_w": "main_consumption",
        "ch2_w": None,
        "ch3_w": None,
        "tmpr": "living_room_temperature"
    }
    data_folder = "data"

    num_lines = sum(1 for line in open(log_file))   

    stdout.write("\rParsing line     0 on %s (0.00%%) in 0s" % (
        num_lines))
    stdout.flush()

    t0 = clock()

    with open(log_file) as myFile:
        for num, line in enumerate(myFile, 1):
            percent = (float(num) / num_lines) * 100
            mod = 1000
            
            if (num % mod) == 0:
                stdout.write("\rParsing line %s on %s (%.2f%%) in %ss" % (
                    num, num_lines, percent, clock() - t0))
                stdout.flush()

            line = line.replace(" - rbmq_messager.py - send - ERROR - ", "")
            line = line.replace("\n", "").replace("\r", "")
            line = line[20:-1]
            
            try:
                line = json.loads(line)
                
                data = line["message"]
                device_id = line["deviceID"]
                site_id = line["siteID"]
                data_date = line["date"]
                data_dst_timezone = line["dstTimezone"]
                data_non_dst_timezone = line["nonDstTimezone"]
                
                topic, message = data_validator(data, device_id, site_id)
                message = {
                    "siteID": site_id,
                    "deviceID": device_id,
                    "message": message,
                    "variableID": device_id,
                    "value": message,
                    "date": data_date,
                    "dstTimezone": data_dst_timezone,
                    "nonDstTimezone": data_non_dst_timezone
                }

                if not "<msg>" in data:
                    message["variableID"] = "error"
                    file_storage_space.insert_error(message)

                topic, message, series = get_currentcost_message(
                    topic, message, data, timeseries_args, data_folder)

                for serie in series:
                    # We send JSON series
                    file_storage_space.insert_series(serie)
            except ValueError as e:
                stdout.write("\n")
                print(e)


    stdout.write("\rParsing line %s on %s (100.00%%) in %ss" % (
        num_lines, num_lines, clock() - t0))
    stdout.flush()
    stdout.write("\n")

if __name__ == "__main__":
    # Launch main method
    main()
