#!/usr/bin/ruby
# encoding: utf-8

class RescueScreen	
	def initialize(extlayers, button, nwscreen)
		
		### Combo for writeable drives when file managers are selected
		@writeablecombo = nil
		@writeablelist = Array.new
		@writeableparts = Array.new
		# Try to omit opening of firefox when the cloud layer is shown the first time
		@cloudshowcount = 0
		### First panel, selection of tasks
		# First tile, rescue on file system level
		button1 = Gtk::EventBox.new.add Gtk::Image.new("rescuewine.png")
		text1 = Gtk::Label.new
		text1.width_request = 380
		text1.wrap = true
		text1.set_markup("<span foreground='white'><b>Daten lokal sichern</b>\n\nDiese Funktion zeigt alle Laufwerke dieses Computers in einem Fenster und Ihre externe Festplatte in einem zweiten Fenster an. So können Sie wichtige Dateien zum Beispiel auf ein USB-Laufwerk kopieren. Schließen Sie die externe Festplatte an, bevor Sie diese Option auswählen.</span>")
	
		# Second tile, rescue to cloud
		button2 = Gtk::EventBox.new.add Gtk::Image.new("rescueturq.png")
		text2 = Gtk::Label.new
		text2.width_request = 380
		text2.wrap = true
		text2.set_markup("<span foreground='white'><b>Daten in die COMPUTER BILD Cloud sichern</b>\n\nAuch hier erhalten Sie Zugriff auf alle PC-Laufwerke und können bis zu 300 Megabyte große Dateien per Internet-Browser in der COMPUTER BILD Cloud sichern. In der kostenlosen Variante haben Sie dort bis zu 2 Gigabyte Speicherplatz.</span>")
		
		# Third tile, image 1:1
		button3 = Gtk::EventBox.new.add Gtk::Image.new("rescueorange.png")
		text3 = Gtk::Label.new
		text3.width_request = 380
		text3.wrap = true
		text3.set_markup("<span foreground='white'><b>Klon Ihrer Festplatte</b>\n\nWählen Sie diese Option bei drohenden Festplattendefekten. Sämtliche Partitionen, Dateien und Programme auf dem Laufwerk werden eins zu eins auf eine externe Festplatte überspielt. Achtung: Alle auf dem Ziel-Laufwerk gespeicherte Daten gehen dadurch verloren!</span>.")
		
		@layers = Array.new
		fixed = Gtk::Fixed.new
		fixed.put(button1, 0, 0)
		fixed.put(button2, 0, 130)
		fixed.put(button3, 0, 260)
		fixed.put(text1, 130, 0)
		fixed.put(text2, 130, 130)
		fixed.put(text3, 130, 260)
		
		TileHelpers.place_back(fixed, extlayers)
		extlayers["rescuestart"] = fixed
		@layers[0] = fixed
		
		button.signal_connect('button-release-event') { |x, y|
			if y.button == 1 
				extlayers.each { |k,v|v.hide_all }
				extlayers["rescuestart"].show_all
			end
		}
		button1.signal_connect('button-release-event') { |x, y|
			if y.button == 1 
				@writeablelist, @writeableparts = reread_targetlist(@writeablecombo)
				extlayers.each { |k,v|v.hide_all }
				extlayers["rescuelocal"].show_all
			end
		}
		button2.signal_connect('button-release-event') { |x, y|
			if y.button == 1 
				extlayers.each { |k,v|v.hide_all }
				if nwscreen.test_connection == false
					nwscreen.nextscreen = "rescuecloud"
					nwscreen.fill_wlan_combo 
					# Check for networks first...
					extlayers["networks"].show_all
				else
					extlayers["rescuecloud"].show_all
				end
				
			end
		}
		button3.signal_connect('button-release-event') { |x, y|
			if y.button == 1 
				extlayers.each { |k,v|v.hide_all }
				extlayers["clonesource"].show_all
			end
		}
		
		#### Screen for filetypes
		locallayers = get_local_layer(extlayers)
		extlayers["rescuelocal"] = locallayers
		@layers[1]  = locallayers

		#### Screen for file manager
		fmlayers = get_fm_layer(extlayers)
		extlayers["rescuefilemanager"] = fmlayers
		@layers[2]  = fmlayers
		
		#### Screen for cloud
		cloudlayer = get_cloud_layer(extlayers)
		extlayers["rescuecloud"] = cloudlayer
		@layers[3] = cloudlayer

	end
	attr_reader :layers
	
	def get_local_layer(extlayers)
		fixed = Gtk::Fixed.new
		TileHelpers.place_back(fixed, extlayers)
		deltext = TileHelpers.create_label("<b>Sicherungs-Laufwerk auswählen</b>\n\nWählen Sie das Laufwerk für Ihre Daten. Neue USB-Laufwerke erscheinen nach einem Klick auf \"Neu einlesen\". Das Sicherungs-Laufwerk wird schreibbar eingebunden und als Ordner <b>Sicherung</b> angezeigt. Alle anderen Laufwerke werden aus Sicherheitsgründen nur lesbar eingebunden.", 510)
		@writeablecombo = Gtk::ComboBox.new
		@writeablecombo.height_request = 32
		@writeablecombo.width_request = 380
		reread = Gtk::Button.new("Neu einlesen")
		reread.width_request = 120
		reread.height_request = 32
		reread.signal_connect('clicked') {
			@writeablelist, @writeableparts = reread_targetlist(@writeablecombo)
		}
		text5 = Gtk::Label.new
		text5.width_request = 250
		text5.wrap = true
		text5.set_markup("<span color='white'>Klicken Sie hier, um zum Datei-\nmanager zu gelangen.</span>")
		forw  = Gtk::EventBox.new.add Gtk::Image.new("forward.png")
		button1 = Gtk::Image.new("rescuegreen.png")
		forw.signal_connect('button-release-event') { |x, y|
			if y.button == 1 
				if @writeableparts.size < 1
					TileHelpers.error_dialog("Es wurden keine geeigneten Laufwerke gefunden. Bitte ggf. USB-Laufwerke anschließen und auf \"Neu einlesen\" klicken.", "Keine Laufwerke gefunden")
				else
					extlayers.each { |k,v|v.hide_all }
					mount_all( @writeableparts[@writeablecombo.active] )
					extlayers["rescuefilemanager"].show_all
					system("su surfer -c 'Thunar /cobi/sicherung' &") 
					system("su surfer -c 'Thunar /media' &") 
				end
			end
		}
		fixed.put(button1, 0, 0)
		fixed.put(deltext, 130, 0)
		fixed.put(reread, 520, 118)
		fixed.put(@writeablecombo, 130, 118)
		fixed.put(forw, 853, 282)
		fixed.put(text5, 605, 288)
		return fixed
	end

	# Layer for filemanager
	def get_fm_layer(extlayers)
		fixed = Gtk::Fixed.new
		backbutton = TileHelpers.place_back(fixed, extlayers, false)
		button1 = Gtk::Image.new("rescuegreen.png")
		deltext = TileHelpers.create_label("<b>Dateien kopieren</b>\n\nZiehen Sie Ihre Dateien aus dem Fenster \"media\" ins Fenster \"sicherung\", um sie dorthin zu kopieren. Im Fenster \"media\" können Sie auf Ihre weiteren Laufwerke zugreifen. Falls Sie ein Fenster versehentlich geschlossen haben oder ein zusätzliches öffnen möchten, klicken Sie auf \"Dateimanager öffnen\"." , 510)
		thbutton = Gtk::Button.new("Dateimanager öffnen")
		thbutton.width_request = 150
		thbutton.height_request = 32
		thbutton.signal_connect('clicked') {
			system("su surfer -c 'Thunar /media' &") 
		}
		backbutton.signal_connect('button-release-event') { |x, y|
			if y.button == 1 
				extlayers.each { |k,v|v.hide_all }
				system("killall Thunar")
				system("killall -9 Thunar")
				TileHelpers.umount_all
				extlayers["start"].show_all
			end
		}
		fixed.put(button1, 0, 0)
		fixed.put(deltext, 130, 0)
		fixed.put(thbutton, 490, 128)
		return fixed
	end

	def get_cloud_layer(extlayers)
		fixed = Gtk::Fixed.new
		backbutton = TileHelpers.place_back(fixed, extlayers, false)
		button1 = Gtk::Image.new("rescuegreen.png")
		deltext = TileHelpers.create_label("<b>COMPUTER BILD-Cloud öffnen</b>\n\nAlle Laufwerke wurden lesbar eingebunden. Der Internet-Browser Firefox startet jetzt und lädt die COMPUTER BILD-Cloud. Nach der Anmeldung/Registrierung können Sie Ihre Dateien dort sichern. Falls Sie Firefox versehentlich geschlossen haben, klicken Sie auf „Firefox öffnen“. ", 510)
		ffbutton = Gtk::Button.new("Firefox öffnen")
		ffbutton.width_request = 150
		ffbutton.height_request = 32
		ffbutton.signal_connect('clicked') {
			system("su surfer -c 'firefox http://www.computerbild-cloud.de/' &") 
		}
		fixed.signal_connect('show') {
			if @cloudshowcount > 0
				mount_all
				system("su surfer -c 'firefox http://www.computerbild-cloud.de/' &") 
			end
			@cloudshowcount += 1
		}
		backbutton.signal_connect('button-release-event') { |x, y|
			if y.button == 1 
				extlayers.each { |k,v|v.hide_all }
				system("killall -15 firefox")
				sleep 2
				system("killall -9 firefox")
				TileHelpers.umount_all
				extlayers["start"].show_all
			end
		}
		fixed.put(button1, 0, 0)
		fixed.put(deltext, 130, 0)
		fixed.put(ffbutton, 490, 108)
		return fixed
	end
	
	def get_clonestart_layer(extlayers)
		
	end
	
	def reread_targetlist(combobox)
		100.downto(0) { |i| 
			begin
				combobox.remove_text(i) 
			rescue
			end
		}
		TileHelpers.umount_all
		drives = Array.new
		partitions = Array.new
		Dir.entries("/sys/block").each { |l|
			drives.push(MfsDiskDrive.new(l, false)) if l =~ /[a-z]$/ 
		}
		drives.each { |d|
			d.partitions.each  { |p|
				label = label = "#{d.vendor} #{d.model}"
				if d.usb == true
					label = label + " (USB) "
				else
					label = label + " (SATA/eSATA/IDE) "
				end
				label = label + "#{p.device} #{p.human_size}"
				if ( p.fs =~ /vfat/ || p.fs =~ /ntfs/ || p.fs =~ /ext/ || p.fs =~ /btrfs/ ) && p.mount_point.nil? 
					label = label + " #{p.fs}"
					partitions.push p.device
					combobox.append_text(label)
				end
			}
		}
		combobox.active = 0
		return drives, partitions
	end
	
	def mount_all(writeable_part=nil)
		begin
			bookmarks = File.new("/home/surfer/.gtk-bookmarks", "w")
		rescue
			bookmarks = File.new("/tmp/.gtk-bookmarks", "w")
		end
		drives = Array.new
		Dir.entries("/sys/block").each { |l|
			drives.push(MfsDiskDrive.new(l, false)) if l =~ /[a-z]$/ 
		}
		drives.each { |d|
			d.partitions.each { |p|
				if p.device == writeable_part
					system("mkdir -p /cobi/sicherung") 
					p.mount("rw", "/cobi/sicherung", 1000, 1000)
					bookmarks.write("file:///cobi/sicherung\n")
				else
					system("mkdir -p /media/#{p.device}")
					p.mount("ro", "/media/#{p.device}", 1000, 1000)
					bookmarks.write("file:///media/#{p.device}\n")
				end
			}
		}
		bookmarks.close
		system("chown 1000:1000 /home/surfer/.gtk-bookmarks")
	end
	
end