#!/usr/bin/env python3
#
# --------------------------------------------------------
# Text Report Window for the Open Galaxy characterization
# tool (simple text window with contents read from file)
#
# --------------------------------------------------------
# Written by Tim Edwards
# efabless, inc.
# June 27, 2017
# Version 0.1
# --------------------------------------------------------

import os
import re
import tkinter
from tkinter import ttk


class TextReport(tkinter.Toplevel):
    """Open Galaxy text report window."""

    def __init__(self, parent=None, fontsize=11, *args, **kwargs):
        """See the __init__ for Tkinter.Toplevel."""
        tkinter.Toplevel.__init__(self, parent, *args, **kwargs)

        s = ttk.Style()
        s.configure(
            'normal.TButton',
            font=('Helvetica', fontsize),
            border=3,
            relief='raised',
        )
        self.protocol('WM_DELETE_WINDOW', self.close)

        self.withdraw()
        self.title('Open Galaxy Text Report')

        self.texttitle = ttk.Label(
            self, style='title.TLabel', text='(no text)'
        )
        self.texttitle.grid(column=0, row=0, sticky='news')
        self.textbar = ttk.Separator(self, orient='horizontal')
        self.textbar.grid(column=0, row=1, sticky='news')

        self.hframe = tkinter.Frame(self)
        self.hframe.grid(column=0, row=2, sticky='news')
        self.hframe.textdisplay = ttk.Frame(self.hframe)
        self.hframe.textdisplay.pack(side='left', fill='both', expand='true')
        self.hframe.textdisplay.page = tkinter.Text(
            self.hframe.textdisplay, wrap='word'
        )
        self.hframe.textdisplay.page.pack(
            side='top', fill='both', expand='true'
        )
        # Add scrollbar to text window
        self.hframe.scrollbar = ttk.Scrollbar(self.hframe)
        self.hframe.scrollbar.pack(side='right', fill='y')
        # attach text window to scrollbar
        self.hframe.textdisplay.page.config(
            yscrollcommand=self.hframe.scrollbar.set
        )
        self.hframe.scrollbar.config(
            command=self.hframe.textdisplay.page.yview
        )

        self.bbar = ttk.Frame(self)
        self.bbar.grid(column=0, row=3, sticky='news')
        self.bbar.close_button = ttk.Button(
            self.bbar, text='Close', command=self.close, style='normal.TButton'
        )
        self.bbar.close_button.grid(column=0, row=0, padx=5)

        self.rowconfigure(0, weight=0)
        self.rowconfigure(1, weight=0)
        self.rowconfigure(2, weight=1)
        self.rowconfigure(3, weight=0)
        self.columnconfigure(0, weight=1)

        # Initialize with empty page
        self.text = []
        self.title = '(No file to display)'
        self.timestamp = 0

    def grid_configure(self, padx, pady):
        pass

    def display(self, filename=''):
        # Read from file if text is empty
        if filename != '':
            if filename == self.title:
                statbuf = os.stat(filename)
                if self.text == [] or self.timestamp < statbuf.st_mtime:
                    self.add_text_from_file(filename)
                    self.timestamp = statbuf.st_mtime
            else:
                self.add_text_from_file(filename)

        # Remove and replace contents
        self.hframe.textdisplay.page.delete('1.0', 'end')
        self.hframe.textdisplay.page.insert('end', self.text)
        self.textttitle.configure(text=self.title)
        self.open()

    # Fill the text report from a file.

    def add_text_from_file(self, filename):
        print('Loading text from file ' + filename)
        with open(filename, 'r') as f:
            self.text = f.read()
        self.title = filename
        self.display()

    def close(self):
        # pop down text window
        self.withdraw()

    def open(self):
        # pop up text window
        self.deiconify()
        self.lift()
