module Fullstack
  module Cms
    
    class Configuration
      attr_writer :linkables, :localized 
          
      def default_locale
        "#{I18n.default_locale}" || "en"
      end
      
      def localized
        @localized.nil? ? true : @localized
      end
      alias :localize :localized
      alias :localized? :localized

      
      def linkables
        @linkables || []
      end
      
      def resources(&block)
        Fullstack::Admin.resources(&block)
      end
      
      # config.menu( 'main', :localized => true )
      #
      # ...
      # menu( 'main', :locale => I18n.locale )
      # menu_items( 'main', :locale => I18n.locale )  
      #
      #
      #
      def menu(uid, options = {})
        return nil unless Menu.table_exists?
        options = options.reverse_merge({:localized => localized?})
        localized_menu = options.delete(:localized)
        
        if localized_menu && localized? # ignores the option if CMS is not localized
          I18n.available_locales.each do |locale|
            m = Menu.find_or_create_by_uid_and_locale(uid.to_s, locale.to_s)
            raise m.errors.full_messages.join("\n") if m.errors.any?
              
          end
        else
          m = Menu.find_or_create_by_uid(uid.to_s)
          raise m.errors.full_messages.join("\n") if m.errors.any?
          
        end
      end
      
      # config.setting('description', :kind => :text, :localized => true, :group => group)
      # setting('website/description', :locale => I18n.locale)
      #
      def setting(key, options = {})
        return nil unless Setting.table_exists?

        options = options.reverse_merge({ :localized => localized? }).merge({ :autocreate => true })
        localized_setting = options.delete(:localized)

        if localized_setting && localized? # ignores the option if CMS is not localized
          I18n.available_locales.each do |locale|
            Setting.global(key.to_s, options.merge(:locale => locale.to_s))
          end
        else
          Setting.global(key.to_s, options)
        end


      end
      
    end
  
    
    class << self
  
      def config
        @config ||= ::Fullstack::Cms::Configuration.new
      end
    
      def configure
        yield(config)
        config
      end
      
      delegate :linkables, :localized, :localized?, :resources, :to => :config
      
    end
    
  end
end