#!/usr/bin/env ruby
# frozen_string_literal: true

require 'json'
require 'icalendar'

# Please @NoctuaNivalis
require 'socket'

#
#
# PREPROCESS
#
#

preprocess do
  `npm install`

  @items.find_all('/posts/**/*').each do |i|
    year_str = %r{/(\d\d)-\d\d/}.match(i.identifier).captures[0]
    academic_year = year_str.to_i

    attr_hash = {
      # Tag all posts with article (for Blogging helper)
      kind: 'article',
      academic_year: academic_year
    }

    i.update_attributes(attr_hash)
  end

  # academic_years is defined in archives.rb
  academic_years.each do |year|
    @items.create(
      '',
      { academic_year: year, title: "Blog" },
      "/blog/#{year}-#{year + 1}.html",
      binary: false
    )
  end

  academic_years_items[academic_years.max].update_attributes(
    navigable: true,
    order: 10
  )

  all_events.each do |event|
    event[:time] = Date.parse(event[:time])
  end
end

#
#
# COMPILATION
#
#
compile '/feed.xml' do
  filter :erb
  write '/feed.xml'
end

passthrough '/quotes.json'

#
# ARCHIVES
#
compile '/blog/*' do
  layout '/archive_page.*'
  layout '/generic.*'
  layout '/default.*'
  filter :erb

  filter :relativize_paths, type: :html
end

#
# EVENTS
#
compile '/events/**/*' do
  filter :kramdown

  layout '/eventpost.*'
  layout '/default.*'
  filter :erb

  filter :relativize_paths, type: :html
end

compile '/events/**/*', rep: :text do
  filter :kramdown
  filter :strip_html
end

compile '/events/**/main.md', rep: :ical do
end

compile '/events/**/*', rep: :ical do
  filter :ical
end

#
# POSTS
#
compile '/posts/**/*' do
  filter :kramdown

  layout '/blogpost.*'
  layout '/generic.*'
  layout '/default.*'

  filter :relativize_paths, type: :html
end

compile '/posts/**/*', rep: :text do
  filter :kramdown
  filter :strip_html
end


#
# PROJECTS
#
compile '/projects/*' do
  filter :kramdown
  filter :relativize_paths, type: :html
end

#
# GENERIC ERB PAGES
#
compile '/*_search.json' do
  filter :erb
  write @item.identifier.to_s
end

compile '/**/*.ics' do
  filter :erb
end

compile '/*.erb' do
  layout '/generic.*'
  layout '/default.*'
  filter :erb

  filter :relativize_paths, type: :html
end

#
# ASSETS
#
compile '/assets/scripts/**/*.coffee' do
  filter :coffeescript
end

ignore '/assets/stylesheets/includes/**/*'

compile '/assets/stylesheets/**/*.scss' do
  filter :sass, syntax: :scss
  filter :autoprefixer if Socket.gethostname == 'abysm'
end

passthrough '/assets/images/*.{png,svg}'
passthrough '/assets/**/*.js'

#
#
# ROUTES
#
#

#
# ASSETS
#
route '/assets/stylesheets/**/*' do
  "#{item.identifier.without_ext}.css"
end

route '/assets/scripts/**/*' do
  "#{item.identifier.without_ext}.js"
end

# POSTS
route '/events/**/*', rep: :ical do
  "#{item.identifier.without_ext}.ics"
end

route '/**/*.{erb,html,md}' do
  if item.identifier.without_ext.to_s =~ %r{/index$}
    "#{item.identifier.without_ext}.html"
  else
    "#{item.identifier.without_ext}/index.html"
  end
end

route '/**/*' do
  item.identifier.to_s
end

#
#
# LAYOUTS
#
#

layout '/**/*', :erb