class ExtractTabGUI(object):

    def __init__(self, status_box):
        self.status_box = status_box
        self.resources = SharedGUIResources(self.status_box)

    def create_extract_tab(self, notebook):
        extract_tab = Tk.Frame(notebook)
        notebook.add(extract_tab, text="Extract")
        image_with_data = self.resources.create_select_file_row(extract_tab, "        File with data*")
        new_file_entry = self.resources.create_text_entry_row(extract_tab, "  Save contents as*")
        password_entry = self.resources.create_text_entry_row(extract_tab, "Password (Optional)")
        self.extract_button_row(extract_tab, image_with_data, password_entry, new_file_entry)
        notebook.pack()

    def extract_button_row(self, extract_tab, image_with_data, password, new_file_entry):
            row = Tk.Frame(extract_tab)
            row.pack(side=Tk.TOP, fill=Tk.X)
            paddingL = Tk.Label(row, width=15, text='')
            paddingL.pack(side=Tk.LEFT, expand=Tk.YES)
            button = Tk.Button(
                row,
                text='Extract Data',
                command=lambda: self.extract(
                    message="Processing........",
                    image_with_data=image_with_data.get(),
                    new_file=new_file_entry.get(),
                    password=password.get()))
            button.pack(side=Tk.LEFT, pady=3, expand=Tk.YES)
            button.config(font=('Monospaced', 10, 'bold underline'))
            paddingR = Tk.Label(row, width=15, text='')
            paddingR.pack(side=Tk.LEFT, expand=Tk.YES)

    def extract(self, message, image_with_data, new_file, password):
        self.resources.update_status_box(message)
        output_dir = sep.join([expanduser('~'), "Downloads"])
        try:
            extracted_content = extract_data_from_stegano_image(image=image_with_data, cipher_key=password)
            self.write_extracted_content_to_file(extracted_content, "{0}{1}{2}".format(output_dir, sep, new_file))
            self.resources.update_status_box('Extraction successful {0} saved in Downloads folder'.format(new_file))
        except Exception as e:
            self.resources.update_status_box(e)

    def write_extracted_content_to_file(self, content_to_write, save_as):
        with open(save_as, "w") as f:
            f.write(content_to_write)
class EncodeTabGUI(object):

    def __init__(self, status_box):
        self.status_box = status_box
        self.resources = SharedGUIResources(self.status_box)

    def create_encode_tab(self, notebook):
            encode_tab = Tk.Frame(notebook)
            notebook.add(encode_tab, text="Encode")
            cover_file = self.resources.create_select_file_row(encode_tab, "File to hide data in*")
            data_file = self.resources.create_select_file_row(encode_tab, "           File to hide*")
            new_file_entry = self.resources.create_text_entry_row(encode_tab, "  Output file name*")
            password_entry = self.resources.create_text_entry_row(encode_tab, "Password (Optional)")
            self.encode_button_row(encode_tab, cover_file, data_file, password_entry, new_file_entry)
            notebook.pack()

    def encode_button_row(self, encode_tab, cover_file, data_file, password, new_file_entry):
            row = Tk.Frame(encode_tab)
            row.pack(side=Tk.TOP, fill=Tk.X)
            paddingL = Tk.Label(row, width=15, text='')
            paddingL.pack(side=Tk.LEFT, expand=Tk.YES)
            button = Tk.Button(
                row,
                text='Encode Data',
                command=lambda: self.encode(
                    message="Processing........",
                    cover_file=cover_file.get(),
                    data_file=data_file.get(),
                    new_file=new_file_entry.get(),
                    password=password.get()))
            button.pack(side=Tk.LEFT, pady=3, expand=Tk.YES)
            button.config(font=('Monospaced', 10, 'bold underline'))
            paddingR = Tk.Label(row, width=15, text='')
            paddingR.pack(side=Tk.LEFT, expand=Tk.YES)

    def encode(self, message, cover_file, data_file, new_file, password):
        self.resources.update_status_box(message)
        output_dir = sep.join([expanduser('~'), "Downloads"])
        try:
            image_file = create_stegano_image(original_image=cover_file, data_to_hide=data_file, cipher_key=password)
            image_file.save("{0}{1}{2}.png".format(output_dir, sep, new_file.replace(".png", "")))
            self.resources.update_status_box('{0}.pdf succssfully saved in Downloads folder'.format(new_file.replace(".png", "")))
        except Exception as e:
            self.resources.update_status_box(e)