module Cmor::Cms
  # Creates root pages for all given locales.
  #
  # After installing the cms you don't have any pages. This service
  # creates home pages for all (or the given) locales.
  #
  # Usage:
  #
  #     Cmor::Cms::AddHomepagesService.call(locales: [:de, :en])
  #
  class AddHomepagesService < Rao::Service::Base
    class Result < Rao::Service::Result::Base
    end
    
    attr_accessor :locales

    validates :locales, presence: true

    def initialize(attributes = {}, options = {})
      attributes.reverse_merge!({ locales: I18n.available_locales })
      attributes[:locales].try(:reject!, &:blank?)

      super(attributes, options)

      @all_pages              = []
      @already_existent_pages = []
      @failed_pages           = []
      @created_pages          = []
    end

    def _perform
      create_homepages
      warn("Skipped #{@already_existent_pages.size} already existent pages for locales: #{@already_existent_pages.map(&:locale).join(', ')}") if @already_existent_pages.any?
      info("Added #{@created_pages.size} new home pages for locales: #{@created_pages.map(&:locale).join(', ')}")
      warn("Failed adding #{@failed_pages.size} new home pages for locales: #{@failed_pages.map(&:locale).join(', ')}") if @failed_pages.any?

    end

    private

    def warn(message)
      say(message)
    end

    def info(message)
      say(message)
    end

    def create_homepages
      @all_pages = @locales.collect do |locale|
        say "Adding homepage for locale #{locale}"
        page = Cmor::Cms::Page.where(locale: locale, pathname: '/', basename: 'home', handler: 'textile').first_or_initialize
        unless page.new_record?
          @already_existent_pages << page
          warn "already exists"
          next page
        end 
        page.tap do |page|
          page.title            = "Homepage (#{locale})"
          page.meta_description = 'home'
          page.body             = "h1. Homepage (#{locale})"
          page.pathname         = '/'
          page.basename         = 'home'
          page.locale           = locale
          page.handler          = 'textile'
        end
        if page.save
          @created_pages << page
          info "done"
        else
          @failed_pages << page
          errors << page.errors
          warn "could not save page. errors: #{page.errors.full_messages.to_sentence}"
        end
        page
      end
    end
  end
end