class websites::setup {
  # Third-party hosted nodes generally aren't behind an https proxy
  $hosting_type = hiera('nodo::vserver::hosting_type', 'direct')

  # Include apache
  class { 'apache':
    https_proxy => $hosting_type ? {
      'direct' => 'yes',
      default  => false,
    },
  }

  # The needed apache modules
  apache::module { "alias":
    ensure  => present,
  }

  # Images folder
  file { "${apache::www_folder}/images":
    ensure  => directory,
    recurse => true,
    purge   => true,
    force   => true,
    owner   => "root",
    group   => "root",
    # This mode will also apply to files from the source directory
    mode    => 0644,
    # Puppet will automatically set +x for directories
    source  => [ "puppet:///modules/site_apache/htdocs/${::domain}/images",
                 "puppet:///modules/nodo/htdocs/images", ]
  }

  # Web index
  file { "${apache::www_folder}/index.html":
    ensure  => present,
    owner   => "root",
    group   => "root",
    mode    => 0644,
    source  => [ "puppet:///modules/site_apache/htdocs/${::domain}/index.html",
                 "puppet:///modules/nodo/htdocs/index.html", ]
  }

  # Missing page
  file { "${apache::www_folder}/missing.html":
    ensure  => present,
    owner   => "root",
    group   => "root",
    mode    => 0644,
    source  => [ "puppet:///modules/site_apache/htdocs/${::domain}/missing.html",
                 "puppet:///modules/nodo/htdocs/missing.html", ]
  }

  # Make sure that a top level index exists
  file { "/var/www/index.html":
    ensure => present,
  }

  # Default vhost: can just be applied on the defining host
  apache::site { "${apache::server_name}":
    server_alias => "${::domain}",
    docroot      => "${apache::www_folder}",
    mpm          => false,
    tag          => 'all',
  }

  # We have to use 'zzz-error' so it will be the last matched vhost
  apache::site { "error":
    template       => 'apache/error.erb',
    docroot        => "${apache::error_folder}",
    filename       => 'zzz-error',
    mpm            => false,
    tag            => 'all',
  }

  # Index page for error
  file { "${apache::error_folder}/index.html":
    ensure  => "${apache::www_folder}/index.html",
    owner   => "root",
    group   => "root",
    force   => true,
    require => File["${apache::error_folder}"],
  }

  # Images folder for error
  file { "${apache::error_folder}/images":
    ensure  => "${apache::www_folder}/images",
    owner   => "root",
    group   => "root",
    force   => true,
    require => File["${apache::error_folder}", "${apache::www_folder}/images"],
  }

}

class websites::hosting inherits websites::setup {
  # Include the needed classes for website hosting
  include php
  include trac
  include websvn
  include moin
  include apache::rails

  # Declare the needed classes for website hosting 
  class { [ 'drupal', 'ikiwiki', 'pmwiki', 'hotglue', 'wordpress' ]: }
  class {
    'viewvc':
      root_parents => "/var/svn : svn";
  }

  $git_daemon = hiera('nodo::web::git_daemon', True)

  if $git_daemon != false {
    class { 'gitweb': }
  }

  apache::site { "images":
    docroot => "${apache::www_folder}/images",
    mpm     => false,
    tag     => 'all',
  }

  # Remove untagged site instances
  Apache::Site <| tag != $::hostname and tag != 'all' |> {
    ensure => absent,
  }

  # Remove untagged database instances
  Database::Instance <| tag != $::hostname and tag != 'all' |> {
    ensure => absent,
  }

  # Remove untagged ikiwiki instances
  Ikiwiki::Instance <| tag != $::hostname and tag != 'all' |> {
    ensure => absent,
  }
}

class websites::hosting::admin inherits websites::setup {
  # Include the needed classes for admin interfaces
  include trac
  include gitweb
}

class websites::dev::setup inherits websites::setup {
  # Include the needed classes for website development
  include php
  include apache::rails

  # Declare the needed classes for website development
  class { 'drupal': }
}