#!/usr/bin/env python

r"""
This module contains file functions such as file_diff.
"""

import time
import os
import re
from gen_cmd import cmd_fnc_u
robot_env = 1
try:
    from robot.libraries.BuiltIn import BuiltIn
    from robot.libraries import DateTime
except ImportError:
    robot_env = 0


def file_diff(file1_path,
              file2_path,
              diff_file_path,
              skip_string):
    r"""
    Compare the contents of two text files.  The comparison uses the Unix
    'diff' command.  Differences can be selectively ignored by use of
    the skip_string parameter.  The output of diff command is written
    to a user-specified file and is also written (logged) to the console.

    Description of arguments:
    file1_path       File containing text data.
    file2_path       Text file to compare to file1.
    diff_file_path   Text file which will contain the diff output.
    skip_string      To allow for differences which may expected or immaterial,
                     skip_string parameter is a word or a string of comma
                     separated words which specify what should be ignored.
                     For example, "size,speed".  Any line containing the word
                     size or the word speed will be ignored when the diff is
                     performed.  This parameter is optional.

    Returns:
    0 if both files contain the same information or they differ only in
      items specified by the skip_string.
    2 if FILES_DO_NOT_MATCH.
    3 if INPUT_FILE_DOES_NOT_EXIST.
    4 if IO_EXCEPTION_READING_FILE.
    5 if IO_EXCEPTION_WRITING_FILE.
    6 if INPUT_FILE_MALFORMED
    """

    FILES_MATCH = 0
    FILES_DO_NOT_MATCH = 2
    INPUT_FILE_DOES_NOT_EXIST = 3
    IO_EXCEPTION_READING_FILE = 4
    IO_EXCEPTION_WRITING_FILE = 5
    INPUT_FILE_MALFORMED = 6

    # The minimum size in bytes a file must be.
    min_file_byte_size = 1

    now = time.strftime("%Y-%m-%d %H:%M:%S")

    if (not os.path.exists(file1_path) or (not os.path.exists(file2_path))):
        return INPUT_FILE_DOES_NOT_EXIST
    try:
        with open(file1_path, 'r') as file:
            initial = file.readlines()
        with open(file2_path, 'r') as file:
            final = file.readlines()
    except IOError:
        file.close()
        return IO_EXCEPTION_READING_FILE
    except ValueError:
        file.close()
        return INPUT_FILE_MALFORMED
    else:
        file.close()

    # Must have more than a trivial number of bytes.
    if len(initial) < min_file_byte_size:
        return INPUT_FILE_MALFORMED

    if (initial == final):
        try:
            file = open(diff_file_path, 'w')
        except IOError:
            file.close()
        line_to_print = "Specified skip (ignore) string = " + \
            skip_string + "\n\n"
        file.write(line_to_print)
        line_to_print = now + " found no difference between file " + \
            file1_path + " and " + \
            file2_path + "\n"
        file.write(line_to_print)
        file.close()
        return FILES_MATCH

    # Find the differences and write difference report to diff_file_path file
    try:
        file = open(diff_file_path, 'w')
    except IOError:
        file.close()
        return IO_EXCEPTION_WRITING_FILE

    # Form a UNIX diff command and its parameters as a string.  For example,
    # if skip_string="size,capacity",  command = 'diff  -I "size"
    # -I "capacity"  file1_path file2_path'.
    skip_list = filter(None, re.split(r"[ ]*,[ ]*", skip_string))
    ignore_string = ' '.join([("-I " + '"' + x + '"') for x in skip_list])
    command = ' '.join(filter(None, ["diff", ignore_string, file1_path,
                                     file2_path]))

    line_to_print = now + "   " + command + "\n"
    file.write(line_to_print)

    # Run the command and get the differences
    rc, out_buf = cmd_fnc_u(command, quiet=0, print_output=0, show_err=0)

    # Write the differences to the specified diff_file and console.
    if robot_env == 1:
        BuiltIn().log_to_console("DIFF:\n" + out_buf)
    else:
        print "DIFF:\n", out_buf

    file.write(out_buf)
    file.close()

    if rc == 0:
        # Any differences found were on the skip_string.
        return FILES_MATCH
    else:
        # We have at least one difference not in the skip_string.
        return FILES_DO_NOT_MATCH
