#!/usr/bin/env ruby

require File.dirname(__FILE__) + '/../config/environment.rb'
require 'optparse'
require 'optparse/time'

options = {}

OptionParser.new do |opts|
  opts.banner = "Usage: delete_images [options] listing.txt"

  opts.on("-f images_field", "--field", "(default file_name) name of the images table field used to find them") do |l|
    options[:field] = l
  end

  opts.on("-p provider_string_key", "--provider", String, "files will be erased only for this provider string key") do |l|
    options[:provider] = l
  end

  opts.on("-N", "--no-delete", "don't delete, just show what would be done") do |l|
    options[:no_delete] = true
  end

  opts.on("-S", "--send-PP2", "Send pictures to PP2 before deleting them") do |l|
    options[:send_PP2] = true
  end

  opts.on("-E", "--equal", "search for the exact file name") do |l|
    options[:comp] = 'E'
  end

  opts.on("-L", "--like", "search for file name containing the text provided : like '%filename%' ") do |l|
    if  options[:comp] == 'E'
      puts "error : -E and -L options can't be used together, use -h or --help for help"
      exit
    else
      options[:comp] = 'L'
    end
  end

  opts.on_tail("-h", "--help", "Show this message") do
    puts opts
    exit
  end

end.parse!

if ARGV.blank?
  puts 'error : no arguments, use -h or --help for help'
  exit
end

options[:field] = 'file_name' if options[:field].blank?
options[:comp] = 'E' if options[:comp].blank?

ic = 0

ARGV.collect do |f|

  if File.zero?(f)
    puts "Pictures list file #{f} is empty."
  elsif !File.exists?(f)
    puts "Pictures list file #{f} does not exist."
  else
    File.open(f) do |listing|
      log_path = "/var/log/pixways/delete_images/#{Time.now.strftime('%Y%m%d')}/"
      Dir.mkdir(log_path) unless File.exists?(log_path)
      error_log = File.open("#{log_path}#{File.basename(f,".*")}.error-log","a+")

      # Check provider parameter
      if options[:provider]
        prov = Provider.find_by_string_key(options[:provider])
        if prov.blank?
          error_log.puts "Provider with string_key '#{options[:provider]}' does not exist."
          error_log.close
          exit
        else
          provider_id = prov.id
          search_str_complement = " AND provider_id = #{provider_id} "
        end
      else
        search_str_complement = ''
      end

      #Open FTP connexion if send to PP2 option chosen
      if (options[:send_PP2]) && (Server.find_by_is_self(true).name == PIXADMIN_SERVER_NAME)
        ftp_config = YAML.load_file(File.join(Rails.root, 'config', 'ftp.yml'))
        ftp = Net::FTP.new(ftp_config[:ms][:host],ftp_config[:ms][:temp_access][:user], ftp_config[:ms][:temp_access][:passwd])
        ftp.passive = ftp_config[:ms][:passive]
        ftp.chdir('PP2')
      end

      listing.each_line do |l|
        ic += 1
        l.strip!
        unless l.blank?
          if options[:comp] == 'E'
            i = Image.where("#{options[:field]} = \"#{l}\" #{search_str_complement}").first
          else
            # l_wildcard = "\"%#{l}%\""
            # i = Image.where("#{options[:field]} LIKE #{l_wildcard} #{search_str_complement}").first #utiliser .all et prévoir boucle pour les résultats multiples
            if options[:provider]
              imgs = Image.search conditions:{options[:field].to_sym=> l}, with:{provider_id: provider_id}
            else
              imgs = Image.search conditions:{options[:field].to_sym=> l}
            end
            i = imgs.first
          end
          if i.nil? && options[:field] == 'file_name'
            #ToDo : chercher dans tous les sous-dossiers de /var/spool/media/ en utilisant Dir.glob("/var/spool/media/**/#{l}")
            if File.exists?("/var/spool/media/in/#{l}")
              if options[:no_delete]
                puts "#{ic.to_s} - #{l} is in /var/spool/media/in/"
              else
                FileUtils.rm_f("/var/spool/media/in/#{l}")
                puts "#{ic.to_s} - #{l} deleted from /var/spool/media/in/"
              end
            else
              error_log.puts "#{ic.to_s} - #{l} not found"
            end
          elsif i.nil?
            error_log.puts "#{ic.to_s} - #{l} not found"
          end
          unless i.nil?
            #Send pictures to MS in PP2 temp folder
            if options[:send_PP2] && Server.find_by_is_self(true).name == PIXADMIN_SERVER_NAME
              file = "#{Rails.root}/public#{i.medium_location}"
              if options[:no_delete]
                puts "#{file} would be sent to PP2"
              else
                error_ftp = false
                # check if agency prefix is follow by one dot, if not replace by one dot
                file_name = i.file_name
                string_key = Provider.find(i.provider_id).string_key
                string_key_sep = file_name.upcase.partition(string_key.upcase)[2][0]
                file_name = string_key + '.' + file_name.upcase.partition(string_key.upcase+string_key_sep)[2] if string_key_sep!='.'
                begin
                  ftp.putbinaryfile(file, file_name)
                  puts "#{Time.now.to_s} : #{file_name} sent to FTP in PP2 folder"
                  DELETE_LOG.info("#{Time.now.to_s} : #{file_name} sent to FTP in PP2 folder")
                rescue Exception => e
                  error_log.puts "#{Time.now.to_s} : error #{e} : while sending #{file_name} to FTP in PP2 folder. Image will not be deleted."
                  error_ftp = true
                  DELETE_LOG.error("#{Time.now.to_s} : error #{e} : while sending #{file_name} to FTP in PP2 folder. Image will not be deleted.")
                end
              end
            end

            #Destroy pictures
            unless options[:send_PP2] && Server.find_by_is_self(true).name == PIXADMIN_SERVER_NAME && error_ftp
              begin
                if Statistic.where(image_id: i.id).blank?
                  if options[:no_delete]
                    puts "#{ic.to_s} - #{i.file_name} would be deleted"
                  else
                    options[:send_PP2] && (Server.find_by_is_self(true).name == PIXADMIN_SERVER_NAME) ? i.moved_to_pp2 : i.delete_hr
                    puts "#{ic.to_s} - #{i.file_name} deleted"
                  end
                else
                  if options[:no_delete]
                    puts "#{ic.to_s} - #{i.file_name} would be kept for stats"
                  else
                    i.deletion_for_stats(options[:send_PP2])
                    puts "#{ic.to_s} - #{i.file_name} kept for stats"
                  end
                end
              rescue Exception => e
                error_log.puts "#{Time.now.to_s} : error #{e} : while destroying #{i.file_name}"
              end
            end
          end
        end
      end

      ftp.close if (options[:send_PP2]) && (Server.find_by_is_self(true).name == PIXADMIN_SERVER_NAME)
      error_log.close
      File.delete("#{log_path}#{File.basename(f,".*")}.error-log") if File.zero?("#{log_path}#{File.basename(f,".*")}.error-log")
    end
  end
end