#!/usr/bin/python
# -*- coding: utf8 -*-
# -*- Mode: Python; py-indent-offset: 4 -*-
# pylint: disable=C0103

""" Generator of daily report by e-mail. """

# This script take an e-mail and a password in parameter and then read DB

# Todo
# ====
# 
# daily-report pierreleray64@gmail.com phase.test.email phaseTEST2014 -l log/conf

import argparse
from datetime import datetime, timedelta
import logging
import logging.config
from filestorage.db import FileStorage
from filestorage.config import Config
from timeserieslogger.utils import format_message
from messager.rbmq_messager import RabbitMQMessager
import os

SCRIPT_NOT_ACTIVATED = "Daily report deactivated. Please activate it if you"\
" want a daily report. Process terminated."
MISSING_LOG_FILE = "Missing logging file configuration. Process terminated."
MISSING_DATA_FOLDER = "Missing data folder path. Process terminated." 
MISSING_GMAIL_CREDENTIAL = "Missing gmail credentials. Process terminated."
MISSING_TARGET = "Missing target e-mail. Process terminated."
MISSING_SITE_ID = "Missing site_id. Process terminated."

DEFAULT_CONFIG_FILE = "/opt/timevortex/config.ini"

LOGGER = logging.getLogger("timeserieslogger")


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(
        "-c", "--config-file", help="path to configuration file")
    # Return list of argument passed in command line
    return parser.parse_args()


def collect_series_information(site_id, yesterday_date, data_folder):
    """This method collect information from database and return it as a dict.

    :returns: dict -- Dict containing series informations.

    """
    file_storage_space = FileStorage(data_folder)

    series_number = file_storage_space.get_number_of_series(
        site_id, yesterday_date)
    errors_number = file_storage_space.get_number_of_error(
        site_id, yesterday_date)

    return {
        "siteID": site_id,
        "seriesNumbers": series_number,
        "errorNumbers": errors_number
    }


def collect_free_space():
    """This method collect free space on disk.

    :returns: str -- Str containing free space.

    """
    temp_file = "freespace.log"
    os.system('df -h / > %s' % temp_file)
    f = open(temp_file, 'r')
    free = f.readlines()
    f.close()
    free = ''.join(free)
    return free.replace("\n", "<br/>")


def main():
    """Main method that start timevortex process
    """
    # Parse command line argument and format it into according variable
    args = argument_parser()
    config_file = args.config_file
    if config_file is None:
        config_file = DEFAULT_CONFIG_FILE
    config = Config(config_file)
    
    activate = config.get_timeserieslogger_activate_daily_report()
    log_conf = config.get_timeserieslogger_log_file()
    username = config.get_messager_gmail_username()
    password = config.get_messager_gmail_password()
    target = config.get_timeserieslogger_daily_report_target()
    site_id = config.get_timeserieslogger_daily_report_site()
    data_folder = config.get_filestorage_data_folder()
    
    if not activate:
        print(SCRIPT_NOT_ACTIVATED)
        return
    if log_conf is None:
        print(MISSING_LOG_FILE)
        return
    if data_folder is None:
        print(MISSING_DATA_FOLDER)
        return
    if username is None or password is None:
        print(MISSING_GMAIL_CREDENTIAL)
        return
    if target is None:
        print(MISSING_TARGET)
        return
    if site_id is None or len(site_id) == 0:
        print(MISSING_SITE_ID)
        return

    messager = RabbitMQMessager(None, None, None)
    logging.config.fileConfig(log_conf)

    yesterday_date = datetime.utcnow()
    yesterday_date += timedelta(days=-1)
    yesterday_date_series = yesterday_date.strftime("%Y-%m-%d")
    yesterday_date_email = yesterday_date.strftime("%d-%m-%Y")

    series_information = []

    for site in site_id:
        series_information.append(collect_series_information(
            site, yesterday_date_series, data_folder))

    free_space = collect_free_space()

    subject, body = format_message(
        series_information, yesterday_date_email, free_space)

    options = {
        "target": target,
        "subject": subject,
        "body": body
    }
     
    messager.send_email(options, username, password) 
    

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