/*
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package com.celements.inheritor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xwiki.context.Execution;

import com.celements.iterator.DocumentIterator;
import com.celements.iterator.IIteratorFactory;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.doc.XWikiDocument;
import com.xpn.xwiki.web.Utils;

public class ContentInheritor {

  private static Logger _LOGGER = LoggerFactory.getLogger(ContentInheritor.class);

  private IIteratorFactory<DocumentIterator> _iteratorFactory;
  private IEmptyDocumentChecker _emptyDocumentChecker;
  private String _language;
  
  public ContentInheritor(){
  }
  
  public void setIteratorFactory(IIteratorFactory<DocumentIterator> iteratorFactory) {
    _iteratorFactory = iteratorFactory;
  }

  protected IIteratorFactory<DocumentIterator> getIteratorFactory() {
    return _iteratorFactory;
  }
  
  public void setLanguage(String language){
    _language = language;
  }

  protected String getLanguage(){
    if (_language != null) {
      return _language;
    } else {
      return getContext().getLanguage();
    }
  }
  
  public String getTitle(){
    return getTitle("");
  }
  
  public String getTitle(String defaultValue){
    if (getDocument() != null)
      return getDocument().getTitle();
    else
      return defaultValue;
  }
  
  public String getTranslatedTitle(XWikiContext context){
    return getTranslatedTitle(context, "");
  }
  
  public String getTranslatedTitle(XWikiContext context, String defaultValue){
    if (getTranslatedDocument(context) != null)
      return getTranslatedDocument(context).getTitle();
    else 
      return defaultValue;
  }
  
  public String getContent(){
    return getContent("");
  }
  
  public String getContent(String defaultValue){
    if (getDocument() != null)
      return getDocument().getContent(); 
    else
      return defaultValue;
  }
  
  public String getTranslatedContent(XWikiContext context){
    return getTranslatedContent(context, "");
  }
  
  public String getTranslatedContent(XWikiContext context, String defaultValue){
    if (getTranslatedDocument(context) != null)
      return getTranslatedDocument(context).getContent();
    else
      return defaultValue;
  }
  
  public XWikiDocument getDocument(){
    return getDoc();
  }
  
  XWikiDocument getTranslatedDocument(XWikiContext context){
    if (getLanguage() == null){
      throw new IllegalStateException("No language given.");
    }
    return getDoc();
  }

  private XWikiDocument getDoc() {
    if (getIteratorFactory() == null) {
      throw new IllegalStateException("No IteratorFactory given.");
    }
    DocumentIterator iterator = getIteratorFactory().createIterator();
    _LOGGER.info("ContentInheritor getDoc before while : ", iterator.hasNext());
    while(iterator.hasNext()){
      try {
        XWikiDocument doc = iterator.next();
        _LOGGER.debug("ContentInheritor getDoc next: ", doc);
        if (getLanguage() != doc.getDefaultLanguage()){
          doc = doc.getTranslatedDocument(getLanguage(), getContext());
        }
        if (!getEmptyDocumentChecker().isEmpty(doc)) {
          return doc;
        }
      } catch (Exception exp) {
        _LOGGER.warn("Failed to get translated document.", exp);
      }
    }
    return null;
  }
  
  public void setEmptyDocumentChecker(IEmptyDocumentChecker emptyDocumentChecker){
    _emptyDocumentChecker = emptyDocumentChecker;
  }
  
  IEmptyDocumentChecker getEmptyDocumentChecker(){
    if (_emptyDocumentChecker == null){
      _emptyDocumentChecker = new DefaultEmptyDocumentChecker();
    }
    return _emptyDocumentChecker;
  }

  private XWikiContext getContext() {
    return (XWikiContext) Utils.getComponent(Execution.class).getContext().getProperty(
        "xwikicontext");
  }

}

@@ -3768,17 +3768,18 @@
 hile : %22
-,
+ +
  iterato
@@ -3938,17 +3938,18 @@
  next: %22
-,
+ +
  doc);%0D%0A

fix logging in ContentInheritor