#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/environment.rb'
require 'pixways'
include Pixways


options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: update_msimageid_from_metadata.rb [options]"

  opts.on("-p provider_stringkey", "--provider  provider_stringkey", "Process pictures for this provider only") do |p|
    options[:prov] = p
  end

  opts.on("-d", "--dryrun", "No action executed") do |d|
    options[:dryrun] = d
  end

  opts.on("-v", "--verbose", "Verbose") do |v|
    options[:verbose] = v
  end

end.parse!

provider_sk = options[:prov].blank? ? '' : options[:prov]
log_filename = "update_msimageid_from_metadata_#{Time.now.strftime("%Y%m%d-%H%M%S")}.log"
log_file = File.open(log_filename,"a+")
prov = Provider.find_by(string_key: provider_sk) unless provider_sk.blank?
if !provider_sk.blank? && prov.nil?
  puts "Error : provider #{provider_sk} not found"
  exit false
elsif !provider_sk.blank? && !prov.nil?
  #To be sure to get the correct string_key case
  provider_sk = prov.string_key
end

prov_imgs = Image.where(images: {provider_id: prov.id})
if prov_imgs.blank?
  log_file.write("Warning : no images found for #{provider_sk}.\n")
else
  log_file.write("Info : #{prov_imgs.count} images found for #{provider_sk}\n")
  i=0
  prov_imgs.each do |src_img|
    i+=1
    log_file.write("Image n°#{i} - #{src_img.file_name}\n")
    # thumb_file = File.dirname("public#{src_img.thumb_location}")
    begin
      picture_file = Magick::Image.read("#{Rails.root}/public/#{src_img.thumb_location}").first
      ms_picture_id = picture_file.get_iptc_dataset('3:230')
      if ms_picture_id.blank?
        log_file.write("Warning : No ms_picture_id for image #{src_img.file_name}\n")
        next
      end
      ms_image_id = Pixways.marek_decrypt(ms_picture_id,provider_sk)
      if src_img.ms_image_id != ms_image_id.to_i
        old_ms_image_id = src_img.ms_image_id
        src_img.update(ms_image_id: ms_image_id) unless options[:dryrun]
        log_file.write("Info : ms_image_id of image #{src_img.file_name} updated from #{old_ms_image_id} to #{ms_image_id}\n")
      else
        log_file.write("Info : ms_image_id was already correct for image #{src_img.file_name}\n") if options[:verbose]
      end
    rescue => e
      log_file.write("ERROR : error while updating ms_image_id of image #{src_img.file_name} : #{e}\n")
    end
  end
end

log_file.close
puts "Update completed, log file : #{log_filename}"