use super::{Job, UiSender};

/// Otomatik oturum açma ayarını hedef sisteme uygular.
///
/// Ekran yöneticisi (sddm/lightdm/gdm) yapılandırması ISO'da hazır olduğu
/// için burada değiştirilmez; yalnızca kullanıcının seçtiği "otomatik oturum
/// açma" bilgisi mevcut konfigürasyona eklenir. Autologin kapalıysa hiçbir
/// şeye dokunulmaz (ISO varsayılanında otomatik giriş yoktur).
pub struct ConfigureAutologinJob {
    pub mount: String,
    pub display_manager: String,
    pub autologin: bool,
    pub username: String,
    pub desktop_environment: String,
}

#[async_trait::async_trait]
impl Job for ConfigureAutologinJob {
    fn name(&self) -> &str { "job_autologin" }

    async fn run(&self, ui: &UiSender) -> Result<(), String> {
        if !self.autologin {
            ui.log("Otomatik oturum açma kapalı, değişiklik yapılmıyor.");
            return Ok(());
        }

        ui.log(format!(
            "Otomatik oturum açma uygulanıyor: {} ({})",
            self.username, self.display_manager
        ));

        let session = match self.desktop_environment.as_str() {
            "plasma" => "plasmax11.desktop",
            "xfce" => "xfce.desktop",
            "gnome" => "gnome.desktop",
            "cinnamon" => "cinnamon.desktop",
            "budgie" => "budgie-desktop.desktop",
            "lxde" => "LXDE.desktop",
            "lxqt" => "lxqt.desktop",
            "mate" => "mate.desktop",
            "lumina" => "lumina-desktop.desktop",
            _ => "plasmax11.desktop",
        };

        match self.display_manager.as_str() {
            "sddm" => {
                // ISO'nun /usr/lib/sddm/sddm.conf.d içeriğine dokunmadan
                // ayrı bir drop-in dosyası ile autologin eklenir.
                let dir = format!("{}/usr/lib/sddm/sddm.conf.d", self.mount);
                tokio::fs::create_dir_all(&dir).await
                    .map_err(|e| format!("sddm.conf.d oluşturulamadı: {}", e))?;
                let content = format!(
                    "[Autologin]\nUser={}\nSession={}\n",
                    self.username, session
                );
                tokio::fs::write(format!("{}/autologin.conf", dir), content)
                    .await
                    .map_err(|e| format!("autologin.conf yazılamadı: {}", e))?;
            }
            "lightdm" => {
                let dir = format!("{}/etc/lightdm", self.mount);
                let _ = tokio::fs::create_dir_all(&dir).await;
                let conf = format!("{}/lightdm.conf", dir);
                let mut content = tokio::fs::read_to_string(&conf)
                    .await
                    .unwrap_or_default();
                if !content.contains("[Seat:*]") {
                    content.push_str("[Seat:*]\n");
                }
                if !content.contains("autologin-user=") {
                    content.push_str(&format!("autologin-user={}\n", self.username));
                    content.push_str(&format!("autologin-session={}\n", self.desktop_environment));
                }
                tokio::fs::write(&conf, content)
                    .await
                    .map_err(|e| format!("lightdm.conf yazılamadı: {}", e))?;
            }
            "gdm" => {
                let dir = format!("{}/etc/gdm", self.mount);
                let _ = tokio::fs::create_dir_all(&dir).await;
                let conf = format!("{}/custom.conf", dir);
                let content = format!(
                    "[daemon]\nAutomaticLoginEnable=true\nAutomaticLogin={}\nDefaultSession={}\n",
                    self.username, session
                );
                tokio::fs::write(&conf, content)
                    .await
                    .map_err(|e| format!("gdm/custom.conf yazılamadı: {}", e))?;
            }
            _ => {
                ui.log(format!(
                    "⚠ Bilinmeyen ekran yöneticisi: {} — autologin uygulanmadı",
                    self.display_manager
                ));
            }
        }

        ui.log("✓ Otomatik oturum açma yapılandırması tamamlandı");
        Ok(())
    }
}
