#!/usr/bin/env ruby

require 'tmpdir'
require 'json'

puts 'running post-commit hook'

BOWER = JSON.parse File.read 'bower.json'

def commit
  @commit ||= `git log | head -1 | cut -d' ' -f2`
end

# get version of library from bower.json
def bower_version(library)
  BOWER["dependencies"][library] || BOWER["devDependencies"][library]
end

# return the base url for a library from bower / github
def library_base_url(library)
  # TODO: figure out how to clean the cache so we can use `bower --offline`
  (@library_base_url ||= {})[library] ||=
    JSON.parse(`bower lookup #{library} --json`)["url"]
    .sub(/^git:\/\/github.com/, 'https://rawgithub.com')
    .sub(/\.git$/, "/#{bower_version(library).sub(/~/, '')}/")
end

# transform script ref to bower URL
def script_url(src)
  if src =~ /\/bower_components\//
    parts = src.split('/bower_components/')[1].split('/')
    library_base_url(parts[0]) + parts.drop(1).join('/')
  else
    src.sub(/^\.\.\/\.\./,
            'https://rawgithub.com/akatov/angular-contenteditable/master')
  end
end

# link href
# script src
def replace_script_and_link(contents)
  ["script src", "link href"].reduce(contents) do |c, tag|
    c.gsub /#{tag}="([^"]*)"/ do
      "#{tag}=\"#{script_url($1)}\""
    end
  end
end

def index_header
  <<EOF
<html>
  <head>
    <title>angular-contenteditable</title>
  </head>
  <body>
    <h1>angular contenteditable</h1>
    <h2>examples<h2>
    <ul>
EOF
end

def index_footer
  <<EOF
    </ul>
  </body>
</html>
EOF
end

puts commit

def execute
  Dir.mktmpdir do |temp|
    FileUtils.cp_r 'test/fixtures/', temp
    FileUtils.mv "#{temp}/fixtures", "#{temp}/examples"
    File.open("#{temp}/index.html", File::CREAT | File::WRONLY) do |index_file|
      index_file.write index_header
      Dir.glob("#{temp}/examples/*.html").each do |file_name|
        bn = File.basename file_name
        puts "changing references in #{bn}"
        File.write file_name, replace_script_and_link(File.read file_name)
        index_file.write "      <li><a href='examples/#{bn}'>#{bn}</a></li>\n"
      end
      index_file.write index_footer
    end
    `git checkout gh-pages`
    `git rm -r examples`
    ['index.html', 'examples'].each do |f|
      FileUtils.cp_r "#{temp}/#{f}", '.'
      `git add #{f}`
    end
    `git commit --message "updating gh-pages for commit #{commit}"`
    `git checkout master`
  end
end

execute
