#!/usr/bin/env python3
import os
import subprocess
import sys
import gi

gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

def run_as_root(cmd_list):
    """
    Verilen komut listesini pkexec ile root olarak çalıştırır.
    """
    try:
        subprocess.run(["pkexec"] + cmd_list, check=True)
    except subprocess.CalledProcessError as e:
        raise RuntimeError(f"Komut hatası: {e.cmd}, Çıkış kodu: {e.returncode}")

def get_mount_device(mount_point):
    """
    /proc/mounts dosyasını okuyarak, verilen mount noktasının bağlı olduğu cihazı döner.
    
    Args:
        mount_point (str): İncelenecek mount noktası, örneğin "/media/root-ro".
        
    Returns:
        str veya None: Mount edilmiş aygıtın adı (örneğin, "/dev/sda1") 
                       veya belirtilen mount noktası bulunamazsa None.
    """
    try:
        with open("/proc/mounts", "r") as f:
            for line in f:
                parts = line.split()
                if parts[1] == mount_point:
                    return parts[0]
    except Exception:
        pass
    return None

def overlay_status():
    """
    /etc/overlayroot.conf dosyasını ve /media/root-rw mount noktasını kontrol eder:
      - Eğer /media/root-rw mount edilmişse, overlay aktif kabul edilir.
      - Aksi halde, /etc/overlayroot.conf dosyasını açar; içeriğinde "tmpfs" ifadesi varsa overlay aktif,
        yoksa overlay pasif olarak belirlenir.
    """
    # İlk olarak /media/root-rw mount edilip edilmediğini kontrol et
    if get_mount_device("/media/root-rw"):
        return True

    # /etc/overlayroot.conf kontrolü
    conf_path = "/etc/overlayroot.conf"
    if os.path.exists(conf_path):
        try:
            with open(conf_path, "r") as f:
                content = f.read()
            return "tmpfs" in content
        except Exception:
            return False
    else:
        # Dosya yoksa paket kontrolü yapılabilir
        try:
            result = subprocess.run(["dpkg", "-l", "romtal-sistem-dondurma"], capture_output=True, text=True)
            return "overlayroot" in result.stdout
        except Exception:
            return False

class OverlayrootGUI(Gtk.Window):
    def __init__(self):
        super().__init__(title="R.O.M.T.A.L Sistem Dondurma")
        self.set_default_size(400, 250)
        self.set_border_width(20)
        
        # Stil ayarları
        css = b"""
        button { 
            font: 15px Arial; 
            padding: 10px;
            margin: 5px; 
        }

        """
        style_provider = Gtk.CssProvider()
        style_provider.load_from_data(css)
        Gtk.StyleContext.add_provider_for_screen(
            Gdk.Screen.get_default(),
            style_provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
        )
        
        self.overlay_enabled = overlay_status()
        self.create_ui()
        
    def create_ui(self):
        grid = Gtk.Grid(column_spacing=10, row_spacing=10)
        
        self.enable_btn = Gtk.Button(label="Sistem Dondurma Aktif Et")
        self.disable_btn = Gtk.Button(label="Sistem Dondurma Devre Dışı Bırak")
        
        self.enable_btn.connect("clicked", self.enable_overlayroot)
        self.disable_btn.connect("clicked", self.disable_overlayroot)
        
        self.status_label = Gtk.Label()
        self.update_status()
        
        # Footer label ekliyoruz
        self.footer_label = Gtk.Label(label="Made By R.O.M.T.A.L | https://rasimoneltml.meb.k12.tr/")
        
        grid.attach(self.status_label, 0, 0, 2, 1)
        grid.attach(self.enable_btn, 0, 1, 1, 1)
        grid.attach(self.disable_btn, 1, 1, 1, 1)
        grid.attach(self.footer_label, 0, 2, 2, 1)
        
        self.add(grid)
        
    def update_status(self):
        status_text = "Şuanki Durum: " + ("Aktif" if self.overlay_enabled else "Devre Dışı")
        self.status_label.set_markup(f"<b>{status_text}</b>")
        self.enable_btn.set_sensitive(not self.overlay_enabled)
        self.disable_btn.set_sensitive(self.overlay_enabled)
        
    def show_dialog(self, message, is_error=False):
        dialog = Gtk.MessageDialog(
            parent=self,
            flags=0,
            message_type=Gtk.MessageType.ERROR if is_error else Gtk.MessageType.INFO,
            buttons=Gtk.ButtonsType.OK,
            text=message
        )
        dialog.run()
        dialog.destroy()
        
    def enable_overlayroot(self, widget):
        try:
            cmd = [
                "sh", "-c",
                ("rm -f /etc/overlayroot.conf && "
                 "echo 'overlayroot_cfgdisk=\"disable\"' > /etc/overlayroot.conf && "
                 "echo 'overlayroot=\"tmpfs\"' >> /etc/overlayroot.conf")
            ]
            run_as_root(cmd)
            self.overlay_enabled = True
            self.update_status()
            self.show_dialog("Overlayroot aktif edildi!\nDeğişikliklerin geçerli olması için yeniden başlatın.")
        except Exception as e:
            self.show_dialog(f"Hata oluştu: {str(e)}", is_error=True)
            
    def disable_overlayroot(self, widget):
        try:
            device = get_mount_device("/media/root-ro")
            if not device:
                raise RuntimeError("'/media/root-ro' mount edilen cihaz bulunamadı.")
            cmd = [
                "sh", "-c",
                (f"mount -o remount,rw {device} && "
                 "rm -f /media/root-ro/etc/overlayroot.conf && "
                 "echo 'overlayroot_cfgdisk=\"disable\"' > /media/root-ro/etc/overlayroot.conf && "
                 "echo 'overlayroot=\"\"' >> /media/root-ro/etc/overlayroot.conf")
            ]
            run_as_root(cmd)
            self.overlay_enabled = False
            self.update_status()
            self.show_dialog("Overlayroot devre dışı bırakıldı!\nDeğişikliklerin geçerli olması için yeniden başlatın.")
        except Exception as e:
            self.show_dialog(f"Hata oluştu: {str(e)}", is_error=True)

if __name__ == "__main__":
    win = OverlayrootGUI()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()