import sys
import tkinter as tk
from tkinter import ttk, messagebox
import xml.etree.ElementTree as ET


file_path = '../XML/vasprun.xml'
window_size = '800x600'

nargs = len(sys.argv)
if nargs >= 2:
    file_path = sys.argv[1]
if nargs >= 3:
    window_size = sys.argv[2]


class XMLViewerEditor:
    def __init__(self, root, file_path, window_size):
        self.root = root
        self.root.title("XML Viewer and Editor")
        self.root.geometry(window_size)

        self.tree = ttk.Treeview(self.root, columns=("Value"))
        self.tree.heading('#0', text='Element')
        self.tree.heading('Value', text='Value')
        self.tree.pack(fill='both', expand=True)

        self.load_xml(file_path)

        self.tree.bind("<Double-1>", self.edit_cell)

        # 保存ボタンを追加
        save_button = tk.Button(self.root, text="Save XML", command=self.save_xml)
        save_button.pack()

    def load_xml(self, file_path):
        try:
            tree = ET.parse(file_path)
            self.root_element = tree.getroot()
            self.display_element(self.root_element, "")
        except ET.ParseError as e:
            print("Error:", str(e))

    def display_element(self, element, parent_id):
        item = self.tree.insert(parent_id, "end", text=element.tag, values=(element.text,))
        for key, value in element.attrib.items():
            self.tree.insert(item, "end", text=f"{key}: {value}")
        for child in element:
            self.display_element(child, item)

    def edit_cell(self, event):
        item = self.tree.selection()[0]
        col = self.tree.identify_column(event.x)
        print(f"col={col}")
        if col == '#1':
            cell_value = self.tree.item(item, 'values')[0]  # セルの現在の値を取得
            self.edit_dialog(item, cell_value)

    def edit_dialog(self, item, current_value):
        edit_window = tk.Toplevel(self.root)
        edit_window.title("Edit Value")
        edit_window.geometry("300x100")

        label = tk.Label(edit_window, text="Edit Value:")
        label.pack()

        entry = tk.Entry(edit_window)
        entry.insert(0, current_value)
        entry.pack()

        save_button = tk.Button(edit_window, text="Save", command=lambda: self.save_cell_edit(item, entry.get(), edit_window))
        save_button.pack()

    def save_cell_edit(self, item, new_value, edit_window):
        self.tree.set(item, 'Value', new_value)  # セルの値を更新
        edit_window.destroy()

    def save_xml(self):
        # Treeviewの変更をXMLに反映
        self.update_xml(self.root_element, self.tree.get_children())
        
        # XMLをファイルに保存
        new_xml = ET.tostring(self.root_element, encoding="utf-8")
        with open("edited.xml", "wb") as xml_file:
            xml_file.write(new_xml)
        print("XML saved as 'edited.xml'")

    def update_xml(self, element, children):
        for child in children:
            item = self.tree.item(child)
            element.text = item['values'][0]
            self.update_xml(element, self.tree.get_children(child))


if __name__ == "__main__":
    root = tk.Tk()
    app = XMLViewerEditor(root, file_path, window_size)
    root.mainloop()