# encoding: UTF-8
$:.push File.expand_path("../lib", __FILE__)
# Maintain your gem's version:
require "announcement/version"
require 'json'
require 'yaml'
bundle_update_flag = ARGV[0]=='update' || ARGV[0]=='install'
if bundle_update_flag
  env_pwd = ENV['PWD']
  begin
    require ::File.expand_path('app/helpers/bundler_helper.rb',  env_pwd)
    extend BundlerHelper
  rescue LoadError
    def bundler_with_clean_env(&block)
      if block_given?
        if Bundler.respond_to?(:with_unbundled_env)
          Bundler.with_unbundled_env(&block)
        else
          Bundler.with_clean_env(&block)
        end
      end
    end
  end
  if File.exist?("#{env_pwd}/app/models/google.rb")
    system("rm -f #{env_pwd}/app/models/google.rb")
  end
  app_path = File.expand_path(__dir__)
  template_path = env_pwd + '/app/templates'
  all_template = Dir.glob(template_path+'/*/')
  puts 'editing files for sassc'
  new_gemfile_text = File.read(app_path+'/temp_file/Gemfile')
  old_gemfile_text = File.read(env_pwd+'/Gemfile')
  check_texts = ['@import "../../bootstrap/variables";',".response-content {\n  justify-self: auto;\n}\n"]
  git_url = bundler_with_clean_env{%x[cd '#{env_pwd}' && git config --get remote.origin.url].split("\n")[0]}
  git_remote = bundler_with_clean_env{%x[cd '#{env_pwd}' && git remote].split("\n")[0]}
  if !(git_url.include?('//ruling.digital/git')) && !(File.exist?("#{env_pwd}/custom_git.txt"))
    puts 'changing remote url'
    bundler_with_clean_env{system("cd #{env_pwd} && git remote set-url #{git_remote} https://ruling.digital/git")}
  end
  default_announcement_widget_info = JSON.parse(File.read("#{app_path}/modules/announcement/info.json"))["widgets"].sort_by{|h| h["filename"].to_i} rescue []
  all_template.each do |folder|
    if !folder.include?('mobile')
      begin
        if folder.split('/')[-1] != 'mobile'
          unity_text = File.open(folder+'assets/stylesheets/template/base/_unity.scss','r:UTF-8') do |f|
                          f.read
                        end rescue ''
          if unity_text.split(/\n/).join.strip.empty?
            File.open(folder+'assets/stylesheets/template/base/_unity.scss', 'a') do |file|
              file.puts "@charset \"utf-8\";\n\n@import \"variables\";\n\n// Title\n.unity-title {\n  margin: 0.5em 0;\n  line-height: 1.5;\n  font-family: $main-font;\n  font-size: $font-h1;\n\n  .layout-footer & {\n    margin-bottom: 10px;\n    border-bottom: none;\n\n    span {\n      display: inline;\n      margin-bottom: 0;\n      border-bottom: none;\n    }\n  }\n}\n\n.status {\n  font-family: $main-font;\n  font-size: 0.75rem;\n}\n\n.status-top {\n  background-color: $theme-color-second;\n}\n\n.status-hot {\n  background-color: $theme-color-third;\n}\n\n.status-source {\n  background-color: $theme-color-main;\n\n  a {\n    color: $theme-white;\n  }\n}\n"
            end
          end
          filename = folder+'assets/stylesheets/template/base/_variables.scss'
          texts = File.open(filename,'r:UTF-8') do |f|
                    f.read
                  end.force_encoding('UTF-8').gsub(/(\r\n){2,}/, "\r\n")
          s1 = texts.scan(/{|}/)
          if s1.count % 2 != 0
            i = texts.rindex(s1[-1])
            texts[i] = ""
          end
          regex_pattern = /((?=^)[ \t\r\n]*)*\.response-content {\n  justify-self: auto;\n}[\r\n]*|((?=^)[ \t\r\n]*)*\.response-content {\n  position: static;\n}[\r\n]*|((?=^)[ \t\r\n]*)*\.response-content {\n  position: relative;\n}[\r\n]*/m  #|((?=^)[ \t\r\n]*)*\.response-content[^{]*{[^}]*@media[^{]*{[^{]*}[^{]*@media[^{]*{[^{]*}[^}]*}[^}]*}
          if !texts.include? "$font-h1:"
            texts = "$font-h1: 1.5rem;\n$font-h2: 1.35rem;\n$font-h3: 1.2rem;\n$font-h4: 1.1rem;\n$font-h5: 1rem;\n$font-h6: 0.9rem;\n\n" + texts
          end
          if !texts.include? "$main-font:"
            texts = "$main-font: Arial, \"微軟正黑體\", \"Helvetica Neue\", Helvetica, sans-serif;\n" + texts
          end
          if !texts.include? "$theme-white"
            texts = "$theme-white: #fff;\n" + texts
          end
          File.open(filename,'w') do |f|
            f.write texts
          end
          tp_text = File.read(folder+'assets/stylesheets/template/template.scss').force_encoding('UTF-8') rescue ''
          tp_last_text = tp_text
          tp_text.scan(/@import.*http.*;/).each do |pat|
            if pat.scan(/@import\W+url/).count==0
              pat1 = pat.sub(/@import\W/,"@import url(")
              pat1 = pat1.sub(/;/,");")
              tp_last_text = tp_last_text.sub(pat,pat1)
            end
          end
          if tp_last_text != tp_text
            File.open(folder+'assets/stylesheets/template/template.scss','w') do |f|
              f.write tp_last_text
            end
          end
          texts = texts.gsub(/\n{2,}/,"\n")
          auto_save_array = texts.scan(regex_pattern)
          if auto_save_array.count > 1
            auto_save_text = auto_save_array.join('')
            File.open(folder+'assets/stylesheets/template/base/_autobackup.bak', 'a') do |file|
              file.puts auto_save_text
            end
            texts = texts.gsub(regex_pattern,"")
            File.open(filename, 'w') do |file|
              file.write (texts)
            end
          end
          check_texts.each do |check_text|
            if !texts.include?(check_text)
              puts "editing #{folder}assets/stylesheets/template/base/_variables.scss"
              texts = texts + "\n" + check_text
              File.open(filename, 'w') do |file|
                file.write(texts)
              end
            end
          end
        end
      rescue => e
        puts "not found #{folder}assets/stylesheets/template/base/_variables.scss"
      end
      begin
        puts "updating announcement show page"
        bundler_with_clean_env{%x[cp -f #{app_path}/modules/announcement/show.html.erb #{folder}modules/announcement/show.html.erb]}
      rescue
        puts "There has some error in updating announcement show page"
      end
      info_json_file = "#{folder}modules/announcement/info.json"
      if File.exist?(info_json_file)
        begin
          file_text = File.read(info_json_file) rescue ""
          encode_file_text = file_text.encode("UTF-8", "UTF-8", invalid: :replace, replace: "???")
          next if (encode_file_text.include?("???") rescue true)
          info = JSON.parse(encode_file_text) rescue {}
          flag = (info.count != 0 rescue false)
          if flag
            puts "Checking announcement widgets"
            widget_info = info["widgets"].sort_by{|h| h["filename"].to_i} rescue []
            update_flag = false
            last_index = widget_info.collect{|v| v["filename"].to_s.scan(/\d+/).collect{|v1| v1.to_i}}.flatten.sort[-1] rescue nil
            if !last_index.nil?
              idx_regex = /^(\d+[\. \t]*)|[ \t]+$/
              default_announcement_widget_info.each do |h|
                name_without_index = h["name"]["zh_tw"].gsub(idx_regex,'')
                widget_info_index = (widget_info.index{|hh| hh["name"]["zh_tw"].gsub(idx_regex,'') == name_without_index}||-1 rescue -1)
                if (widget_info_index == -1 || widget_info_index.nil?)
                  update_flag = true
                  copy_h = h.dup
                  h.delete("force_cover")
                  last_index = last_index + 1
                  copy_h["filename"] = copy_h["filename"].sub(/\d+/){|ff| last_index.to_s}
                  copy_h["name"].keys.each do |locale|
                    copy_h["name"][locale] = copy_h["name"][locale].sub(/\d+/){|ff| last_index.to_s}
                  end
                  widget_info << copy_h
                  bundler_with_clean_env{%x[cp -f #{app_path}/modules/announcement/_#{h["filename"]}.html.erb #{folder}modules/announcement/_#{copy_h["filename"]}.html.erb]}
                elsif h["force_cover"] == "true"
                  bundler_with_clean_env{%x[cp -f #{app_path}/modules/announcement/_#{h["filename"]}.html.erb #{folder}modules/announcement/_#{widget_info[widget_info_index]["filename"]}.html.erb]}
                end
              end
              if update_flag
                info["widgets"] = widget_info
                puts "Writing json #{info["widgets"].count} in #{info_json_file}"
                begin
                  info_json = JSON.pretty_generate(info).gsub(":[",":[\n").gsub(":{",":{\n")
                rescue
                  info_json = info.to_s.gsub("=>",": \n")
                end
                File.open(info_json_file,"w+"){|f| f.write(info_json)}
              end
              bundler_with_clean_env{%x[cp -rn #{app_path}/modules/announcement/thumbs/* #{folder}modules/announcement/thumbs/.]}
            end
          end
        rescue => e
          puts e
          puts "There has some error when checking announcement widgets"
        end
      end
    end
  end
  if old_gemfile_text != new_gemfile_text
    unicorn_rails = %x[which unicorn_rails].sub("\n",'')
    puts 'updating gemfile'
    if Dir["#{env_pwd}/config/secrets.yml"].length==0
      r = open("#{env_pwd}/config/environment.rb",'r'){|f| f.read()}
      secret_key = r.scan(/Orbit::Application\.config\.secret_key_base = '(.*)'/).flatten[0] rescue nil
      if !secret_key.nil?
         open("#{env_pwd}/config/secrets.yml",'w+') do |f|
          c = {"production"=> {"secret_key_base"=> secret_key},"development"=> {"secret_key_base"=> secret_key}}
          c = c.to_yaml.sub("---\n",'')
          f.write(c)
        end
      end
    end
    bundler_with_clean_env{%x[cp -f '#{env_pwd}'/Gemfile '#{env_pwd}'/Gemfile.bak123]}
    bundler_with_clean_env{%x[cp -f '#{app_path}'/temp_file/Gemfile '#{env_pwd}'/Gemfile]}
    check_version = %x[cd #{env_pwd} && git rev-list `git rev-parse --abbrev-ref HEAD` | grep 2f23511469505bd114df2c863a477a8730bcdefa]
    if check_version.strip != '' #update mongoid version
      command4 = ""
      puts 'mongoid has been updated!'
    else
      command4 = ";mv #{env_pwd}/app/controllers/sessions_controller.rb #{env_pwd}/tmp/sessions_controller_backup.rb;cp -rf #{app_path}/temp_file/app #{env_pwd};cp -rf #{app_path}/temp_file/config #{env_pwd};rm #{env_pwd}/app/models/google.rb"
    end
    log_development = File.mtime(env_pwd+'/log/development.log').strftime('%Y%m%d%H%M').to_i rescue 0
    log_production = File.mtime(env_pwd+'/log/production.log').strftime('%Y%m%d%H%M').to_i rescue 0
    if log_development > log_production
        mode = 'development'
    else
        mode = 'production'
    end
    files = Dir[env_pwd+'/Gemfile.lock']
    dir_name = env_pwd.split('/')[-1]
    watch_dog = %x[screen -ls auto_reopen_#{dir_name}]
    if watch_dog.scan("auto_reopen_#{dir_name}").count != 0
      bundler_with_clean_env{%x[screen -ls | grep auto_reopen_#{dir_name} | cut -d. -f1 | awk '{print $1}' | xargs kill]}
    end
    if %x[ruby -v].scan(/\d\.\d\.\d/)[0] == '2.1.3'
      install_cmd = 'rvm install 2.1.10 && rvm use default 2.1.10;'
      use_cmd = 'source ~/.rvm/scripts/rvm && rvm use 2.1.10 --default;'
    else
      install_cmd = ''
      use_cmd = ''
    end
    #if files.count ==0
    #  command1 = "gem install bundler -v 1.17.3 ; bundle update --all"
    #else
    if RUBY_VERSION.to_f==2.1
    command1 = "gem install bundler -v 1.17.3 ; bundle update --all"
    else
    command1 = "gem install bundler -v 2.3.3 ; bundle update --all"
    end
    #end
    filedata = File.read(env_pwd+"/built_in_extensions.rb")
    exist_str = "gem 'patchfile', git: 'http://gitlab.tp.rulingcom.com/chiu/patch_file.git'"
    if filedata.include? exist_str
        puts "patchfile exist"
    else
        file = env_pwd+"/built_in_extensions.rb"
        open(file, 'a') { |f|
          f.puts exist_str
        }
    end
    all_command = "#{install_cmd} #{command1} #{command4} "
    watch_dog_cmd = "watch -n 30 \'unset UNICORN_FD && bundle exec #{unicorn_rails} -c config/unicorn.rb -D -E #{mode}\'"
    #file = File.new(File.join(env_pwd,'bundle_update_background.sh'),"w")
    #file.write(all_command)
    #file.chmod(0755)
    #file.close
    restart_cmd = "UNICORN_PID=\"`fuser tmp/pids/unicorn.sock tmp/sockets/unicorn.sock tmp/unicorn.sock` `cat tmp/pids/unicorn.pid `\" && kill -s TERM $UNICORN_PID ; while (kill -0 $UNICORN_PID > /dev/null 2>&1) ; do printf '.' && sleep 1 ; done ; unset UNICORN_FD; bundle exec unicorn_rails -c config/unicorn.rb -D -E #{mode}"

    a = Thread.start do
      bundler_with_clean_env do
          puts env_pwd
          puts mode
          exec("cd #{env_pwd} && env -i HOME=\"$HOME\" bash -l -c \"#{all_command}\" ;screen -d -m -S auto_reopen_#{dir_name} bash -c \"#{use_cmd} #{restart_cmd};#{watch_dog_cmd}\" ")
      end
    end
    now_priority = Thread.current.priority.to_i
    system('sleep 2')
    a.priority =  now_priority + 2
    a.run
    #Thread.exit
  else
    dir_name = env_pwd.split('/')[-1]
    watch_dog = %x[screen -ls auto_reopen_#{dir_name}]
    if watch_dog.scan("auto_reopen_#{dir_name}").count != 0
      bundler_with_clean_env{%x[screen -ls | grep auto_reopen_#{dir_name} | cut -d. -f1 | awk '{print $1}' | xargs kill]}
    end
    #system("cp -rf #{app_path}/temp_file/app #{env_pwd}")
  end
  c = open("#{env_pwd}/config/mongoid.yml",'r'){|f| f.read}
  if c.scan(/^[ \t]*sessions\:/).length != 0
    c = c.gsub(/^([ \t]*)sessions\:/,'\1clients:')
    r = YAML.load(c)
    r.each do |mode,v1|
      v1.each do |clients,d|
        d.each do |k,v|
          next if v.class != Hash
          if !v["username"].nil?
            if v["options"].nil?
              v["options"] = {}
            end
            v["options"]["user"] = v["username"]
            v.delete "username"
          end
          if !v["password"].nil?
            if v["options"].nil?
              v["options"] = {}
            end
            v["options"]["password"] = v["password"]
            v.delete "password"
          end
          if !v["options"].nil? && !v["options"]["pool_size"].nil?
            v["options"]["max_pool_size"] = v["options"]["pool_size"]
            v["options"].delete "pool_size"
          end
          if !v["options"].nil? && v["options"]["read"].class == String
            v["options"]["read"] = {"mode"=> v["options"]["read"]}
          end
        end
      end
    end
    c = YAML.dump(r).sub("---\n",'')
    open("#{env_pwd}/config/mongoid.yml",'w+'){|f| f.write(c)}
  end
end
# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
  s.name        = "announcement"
  s.version     = Announcement::VERSION
  s.authors     = ["RulingDigital"]
  s.email       = ["orbit@rulingcom.com"]
  s.homepage    = "http://www.rulingcom.com"
  s.summary     = "Announcements for Orbit"
  s.description = "Announcements for Orbit"
  s.license     = "MIT"
  s.metadata = {
    "_require" => "#{File.expand_path("../app/models/announcement_setting", __FILE__)}",
    "global_hash" => "{enable_manually_sort: (AnnouncementSetting.first.enable_manually_sort rescue false),enable_annc_dept: (AnnouncementSetting.first.enable_annc_dept rescue false), annc_depts_translations: (AnnouncementSetting.first.annc_depts_translations rescue {})}"
  }
  s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"]
  s.test_files = Dir["test/**/*"]

  s.add_dependency "rufus-scheduler", "~> 3.6.0"
  s.add_dependency "mimemagic" , "0.3.9"
end