require 'FileUtils'
require 'Date'
# shoes-backup.rb version 0.9 
class Backup
  attr_reader :dir1, :dir2, :filtro, :dirs, :files
  def initialize(dir1,dir2=".",filtro="*.*")
    @dir1=dir1
    @dir2=dir2
    @filtro=filtro
    update_dirs(dir1)
    update_files
    #copia_estructura
  end
  def update_files
    @files=@dirs.map{|x|gen_lista_archivos_filtrada(x)}.flatten
  end
  def update_dirs(dir)
    @dirs=gen_lista_subdirectorios(dir)
  end
  def gen_lista_subdirectorios(dir)
    results=[dir]
    Dir.entries(dir).each do |entry|
      if File.directory?(dir+"/"+entry) and !(entry=="." or entry=="..")
        results.push(gen_lista_subdirectorios(dir+"/"+entry))
      end
    end
    results.flatten
  end
  def gen_lista_archivos_filtrada(dir,filtro=@filtro)
    files=[]
    Dir.chdir(dir) {
      Dir.glob(filtro).each {|arch| files.push(dir+"/"+arch) }
    }
    files.flatten
  end
  def copia_estructura(con_archivos=true)
    return "Destination Exists. Overwrite not implemented yet." if File.directory?(@dir2)
    @dirs.each do |dir|
      Dir.mkdir(dir.gsub(@dir1,@dir2))
    end
    if con_archivos
      @files.each do |file|
        FileUtils.copy_file(file,file.gsub(@dir1,@dir2))
      end
    end
    return "Done"
  end    
end

if __FILE__==$0
  Shoes.app :height=>200,:title=>"Backup" do
    flow do
      inscription "Origin:"
      @origen=edit_line :width=>400, :text=>'D:/files'
      button "Select" do
        @origen.text=ask_open_folder()
      end
    end
    flow do
      inscription "Destination:"
      @destino=edit_line :width=>400, :text=>(Dir.pwd+"/"+Date.today.to_s)
    end
    flow do
      inscription "Filter:"
      @filtro=edit_line :text=>"*.txt"
    end
    flow do
      @c=check; inscription "Copy folder structure without files" 
    end
    b=button "Go" do
      backup=Backup.new(@origen.text,@destino.text,@filtro.text)
      result=backup.copia_estructura(!@c.checked?)
      if result=="Done" 
        @result.clear() do
          inscription "Copied folders:\n"+backup.dirs.inject(""){|res,x| res+=x+"\n"}
          if (!@c.checked?)
            inscription "Copied files:\n"+backup.files.inject(""){|res,x| res+=x+"\n"}
          end
        end
      end
      alert result
    end
    @result=flow do
    end
  end
end
