"""
summary.py
Created on: May 18, 2016
Proprietary and confidential information of Oxford Nanopore Technologies, Limited
All rights reserved; (c)2016: Oxford Nanopore Technologies, Limited
"""
import os


class SummaryCSV(object):
    """ A simple summary object for writing a delimited
    text file summary.
    """
    
    def __init__(self, fname, field_data, delimiter='\t', start_new_file=True):
        """ Constructor.
        
        :param fname: The filename for the summary file.
        :param field_data: List of (field name, default value) tuples.
        :param delimiter: The delimiter to use.
        """
        self.delimiter = delimiter
        self.filename = fname
        self.handle = open(self.filename, 'w' if start_new_file else 'a')
        self.field_data = field_data
        if start_new_file:
            self.handle.write(delimiter.join(name for name, _ in field_data))
            self.handle.write('\n')
            self.handle.flush()
            os.fsync(self.handle)
        return

    def __enter__(self):
        return self
    
    def __exit__(self, exception_type, exception_value, traceback):
        self.close()
        return False

    def close(self):
        """ Close the file handle.
        """
        if self.handle:
            self.handle.close()
        self.handle = None
        return
    
    def write(self, data):
        """ Write a summary line.
        
        :param data: Dictionary of field-names and values.
        """
        vals = [data.get(key, default) for key, default in self.field_data]
        self.handle.write(self.delimiter.join(str(x) for x in vals))
        self.handle.write('\n')
        self.handle.flush()
        os.fsync(self.handle)
        return
