#!/usr/bin/ruby
#####################
require 'fileutils'
require 'gtk2'
require 'pathname'
#####################
LOG_FILE="install_bibliconc.log"
#####################
def abort_install
    Gtk::MessageDialog::new(nil,Gtk::Dialog::MODAL,Gtk::MessageDialog::Type::ERROR,Gtk::MessageDialog::BUTTONS_OK,"Installation interrompue!").set_window_position(Gtk::Window::POS_MOUSE).run
    exit
end
def error_message(text)
    dialog=Gtk::MessageDialog::new(nil,Gtk::Dialog::MODAL,Gtk::MessageDialog::Type::ERROR,Gtk::MessageDialog::BUTTONS_OK,text).set_window_position(Gtk::Window::POS_MOUSE)
    dialog.run
    dialog.destroy
    log text
end
def log(text,path="")
    system("echo -n \"#{text}\" >> #{path}#{LOG_FILE}")
end
##
Gtk::init
assistant=Gtk::Assistant::new
assistant.set_default_size(400, 300)
header_image=Gdk::Pixbuf::new("bibliconc48.png")
FileUtils::rm(LOG_FILE,:force=>true)
#####################
# Bienvenue
#####################
# Un simple label
page_welcome=Gtk::Label::new("Bienvenue dans l'assistant d'installation de la concordance Bibliquest")
page_welcome.show
#
assistant.append_page(page_welcome)
assistant.set_page_title(page_welcome, "Bienvenue")
assistant.set_page_type(page_welcome,Gtk::Assistant::PAGE_INTRO)
assistant.set_page_header_image(page_welcome,header_image)
assistant.set_page_complete(page_welcome, true)
#####################
# Répertoire d'installation de la concordance
#####################
def test_old_install
    log "--> Recherche d'une ancienne installation....\n"
    system("which bibliconc >> #{LOG_FILE} 2>&1")
    inst_bibliconc=nil
    begin
	file=open(LOG_FILE)
	file.each_line {|l| inst_bibliconc=l.to_s.strip}
	file.close
    rescue
    end
    if !inst_bibliconc||inst_bibliconc.match(/not found$/)||inst_bibliconc.match(/^which: no bibliconc in/) 
	inst_rep="/usr/share/bibliconc" 
    else
	bibliconc=Pathname::new(inst_bibliconc)
	if bibliconc.symlink? then bibliconc=bibliconc.readlink end
	inst_rep=bibliconc.realpath.dirname
    end
    inst_rep.to_s
end
# 4 boutons radio; le dernier offre un bouton de sélection de répertoire
page_install_directory=Gtk::VBox::new(true,0)
$install_directory=""
    # bouton pour /usr/share
    install_dir_usr=Gtk::RadioButton::new("/usr/share/bibliconc (vous devez avoir les droits 'root')")
    install_dir_usr.signal_connect("toggled"){|widget| if widget.active? then $install_directory="/usr/share/bibliconc" end}
page_install_directory.pack_start(install_dir_usr,false,false,0)
    # bouton pour /usr/local/share
    install_dir_usr_local=Gtk::RadioButton::new(install_dir_usr,"/usr/local/share/bibliconc (vous devez avoir les droits 'root')")
    install_dir_usr_local.signal_connect("toggled"){|widget| if widget.active? then $install_directory="/usr/local/share/bibliconc" end}
page_install_directory.pack_start(install_dir_usr_local,false,false,0)
    # bouton pour home dir
    install_dir_home=Gtk::RadioButton::new(install_dir_usr,"#{ENV["HOME"]}/bibliconc")
    install_dir_home.signal_connect("toggled"){|widget| if widget.active? then $install_directory="#{ENV["HOME"]}/bibliconc" end}
page_install_directory.pack_start(install_dir_home,false,false,0)
    # bouton pour répertoire personnalisable
    install_dir_custom=Gtk::HBox::new(false,0)
	install_dir_custom_rb=Gtk::RadioButton::new(install_dir_usr,"Autre")
	install_dir_custom.pack_start(install_dir_custom_rb,false,false,0)
	install_dir_custom_button=Gtk::FileChooserButton::new("Sélection d'un répertoire",Gtk::FileChooser::ACTION_SELECT_FOLDER)
	install_dir_custom.pack_start(install_dir_custom_button,false,false,0)
	install_dir_custom_rb.signal_connect("toggled"){|widget| if widget.active? then install_dir_custom_button.sensitive=true;$install_directory=install_dir_custom_button.filename; else install_dir_custom_button.sensitive=false; end}
	install_dir_custom_button.signal_connect("selection-changed"){|widget| $install_directory=widget.filename}
	#install_dir_custom_button.current_folder="/usr/local"
	folder_filter=Gtk::FileFilter::new
	folder_filter.name="Répertoires"
	folder_filter.add_mime_type("directory")
	install_dir_custom_button.add_filter(folder_filter)
page_install_directory.pack_start(install_dir_custom,false,false,0)
install_dir_custom_rb.active=true
install_dir_usr_local.active=true
page_install_directory.show_all
#
inst_rep=test_old_install
case inst_rep
when "/usr/share/bibliconc"
    install_dir_usr.active=true;
when "/usr/local/share/bibliconc"
    install_dir_usr_local.active=true;
when "#{ENV["HOME"]}/bibliconc"
    install_dir_home.active=true;
else 
    install_dir_custom_rb.active=true;
    install_dir_custom_button.filename=inst_rep;
end
#
assistant.append_page(page_install_directory)
assistant.set_page_title(page_install_directory, "Répertoire d'installation")
assistant.set_page_type(page_install_directory,Gtk::Assistant::PAGE_CONTENT)
assistant.set_page_header_image(page_install_directory,header_image)
assistant.set_page_complete(page_install_directory, true)
#####################
# Création du répertoire d'installation
#####################
# Un simple label
# ouvert uniquement si le répertoire n'existe pas
page_create_install_dir=Gtk::Label::new("Le répertoire #{$install_directory} n'existe pas; il va être créé.")
page_create_install_dir.show
#
assistant.append_page(page_create_install_dir)
assistant.set_page_title(page_create_install_dir, "Création du répertoire")
assistant.set_page_type(page_create_install_dir,Gtk::Assistant::PAGE_CONFIRM)
assistant.set_page_header_image(page_create_install_dir,header_image)
assistant.set_page_complete(page_create_install_dir, true)
#####################
# Copie des fichiers de la concordance
#####################
# un label et une barre d'avancement
# cf. 'prepare' à la fin
page_copy_bibliconc=Gtk::Alignment.new(0.5, 0.5, 0.9, 0.0)
copy_bibliconc_box=Gtk::VBox::new(false,0)
copy_bibliconc_label=Gtk::Label::new
copy_bibliconc_box.pack_start(copy_bibliconc_label,false,false,0)
copy_bibliconc_progress=Gtk::ProgressBar.new
copy_bibliconc_box.pack_start(copy_bibliconc_progress,false,false,0)
page_copy_bibliconc.add(copy_bibliconc_box)
page_copy_bibliconc.show_all
#
assistant.append_page(page_copy_bibliconc)
assistant.set_page_title(page_copy_bibliconc, "Copie des fichiers de la concordance Bibliquest")
assistant.set_page_type(page_copy_bibliconc,Gtk::Assistant::PAGE_PROGRESS)
assistant.set_page_header_image(page_copy_bibliconc,header_image)
#####################
# Résumé
#####################
# Un simple label
page_end=Gtk::Label::new("L'installation de la concordance BIbliquest est terminée.")
page_end.show
#
assistant.append_page(page_end)
assistant.set_page_title(page_end, "Fin de l'installation")
assistant.set_page_type(page_end,Gtk::Assistant::PAGE_SUMMARY)
assistant.set_page_header_image(page_end,header_image)
assistant.set_page_complete(page_end, true)
#####################
# définition des réponses aux signaux
#####################
assistant.signal_connect('cancel') do
    Gtk::main_quit
end
assistant.signal_connect('close') do
    Gtk::main_quit
end
assistant.signal_connect('apply') do
end
assistant.signal_connect('prepare') do |_assistant, page|
    # page de bienvenue
    if page==page_welcome then system("echo \"Début de la procédure d'installation de la concordance\n\n\" > #{LOG_FILE}") end
    # page de sélection du répertoire d'installation
    if page==page_install_directory then log "###\nSélection du répertoire d'installation\n" end
    # page de création du répertoire
    if page==page_create_install_dir then log "###\nConfirmation de la création du répertoire #{$install_directory}\n" end
    # page d'installation de la concordance
    if page==page_copy_bibliconc
	log "###\nInstallation de la concordance Bibliquest"
	log "L'installation aura lieu dans le répertoire #{$install_directory}.\n"
	$prepare_thread=Thread::new {
	    error=false
	    if $install_directory[-1,1]=="/" then $install_directory.chop! end
	    # création du répertoire d'installation
	    if !FileTest.directory?($install_directory)
		begin
		    log "--> Création du répertoire #{$install_directory}...."
		    FileUtils.mkdir_p($install_directory)
		    log "OK\n"
		rescue
		    Gtk::timeout_add(0){error_message "Erreur: impossible de créer le répertoire!\nVérifiez que vous avez les droits d'écriture.";abort_install;}
		    return
		end
	    end
	    # copie des fichiers
	    begin
		log "--> Copie des fichiers de la concordance...."
		copy_bibliconc_progress.fraction=0.0
		copy_bibliconc_label.text="Copie des fichiers de la concordance dans #{$install_directory}"
		FileUtils.cp_r("src/.",$install_directory)
		copy_bibliconc_progress.fraction=0.2
		copy_bibliconc_label.text="Copie des fichiers de langue dans #{$install_directory}/langues"
		FileUtils.cp_r("langues",$install_directory)
		copy_bibliconc_progress.fraction=0.4
		copy_bibliconc_label.text="Copie des fichiers de la Bible dans #{$install_directory}/bibles"
		FileUtils.cp_r("bibles",$install_directory)
		FileUtils.cp_r(["bibliconc16.png","bibliconc48.png"],$install_directory)
		copy_bibliconc_progress.fraction=0.8
		log "OK\n"
	    rescue
		Gtk::timeout_add(0){error_message "Erreur lors de la copie des fichiers de la concordance.";abort_install;}
		return
	    end
	    begin
		log "Fichier Freedesktop"
		FileUtils.cp_r("bibliconc.desktop","/usr/share/applications")
		FileUtils.cp_r("bibliconc48.png","/usr/share/pixmaps")
		log "OK\n"
	    rescue
		log " ---> impossible\n"
	    end
	    # création du lien vers bibliconc.rb
	    $link_directory=if $install_directory.match(/^\/usr\/local/) then "/usr/local/bin" elsif $install_directory.match(ENV["HOME"]) then ENV["HOME"]+"/bin" else "/usr/bin" end
	    begin
		log "--> Création des liens symboliques dans le répertoire #{$link_directory}...."
		copy_bibliconc_label.text="Création de liens symboliques dans #{$link_directory}"
		if !FileTest.directory?($link_directory)
		    FileUtils.mkdir_p($link_directory)
		end
		FileUtils.rm([$link_directory+"/bibliconc"],:force=>true)
		FileUtils.ln_s($install_directory+"/bibliconc.rb",$link_directory+"/bibliconc")
		log "OK\n"
	    rescue
		Gtk::timeout_add(0){error_message "Problème lors de la création des liens symboliques dans le répertoire #{$liens}";error=true;}
		return
	    end
	    # fin
	    copy_bibliconc_progress.fraction=1.0
	    if !error then copy_bibliconc_label.text="Terminé sans erreurs"
	    else copy_bibliconc_label.text="Terminé" end
	    log "Terminé.\n"
	    assistant.set_page_complete(page,true)
	}
    end
    # page de fin
    if page==page_end then log "###\nInstallation terminée\n" end
end
$first_forward=true
assistant.set_forward_page_func{|current_page|
    # Cette fonction est appelée 2 fois (voire 4)!!
    $first_forward=!$first_forward
    if $first_forward 
	case current_page
	when 0
	    1
	when 1
	    page_create_install_dir.set_text("Le répertoire #{$install_directory} n'existe pas; il va être créé.")
	    # page 2 pour créer le répertoire, 3 sinon
	    if FileTest::directory?($install_directory) then 3 else 2 end
	when 2
	    3
	when 3
	    4
	end
    else
	4
    end
}
#####################
# run!
#####################
assistant.show
Gtk::main
