package com.coremedia.documentation;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Writer;

public class Filter extends DefaultHandler {

  private static final String DOCBOOK_NAMESPACE = "http://docbook.org/ns/docbook";

  // private final Writer writer;
  private StringBuilder textBuilder = new StringBuilder();
  private int ignored = 0;
  private int replaced = 0;
  private String vowelString = "aAeEiIoOuUxX";
  private String consonanteString = "bBcCDdfFgGhHjJkKlLmMnNpPqQRrsStTvVwWyYzZ";
  private final Writer writer;
  private boolean skipHyphens = false;
  private StringBuilder chars = new StringBuilder();

  public Filter(Writer writer, boolean skipHyphens) {
    this.writer = writer;
    this.skipHyphens = skipHyphens;
  }

  public Filter(Writer writer) {
    this.writer = writer;
  }

  private static boolean replaceElement(String uri, String qName) {
    return ("programlisting".equals(qName) || "indexterm".equals(qName) || "keycombo".equals(qName)
    || "inlinemediaobject".equals(qName));
  }

  private static boolean ignoreElement(String uri, String qName) {
    return ( "code".equals(qName) || "filename".equals(qName) || "classname".equals(qName) || "application".equals(qName)
            || "methodname".equals(qName) || "property".equals(qName) || "package".equals(qName)
            || "link".equals(qName)  || "constant".equals(qName) || "parameter".equals(qName)
             || "interfacename".equals(qName) || "userinput".equals(qName) || "symbol".equals(qName) || "command".equals(qName)
            || "symbol".equals(qName) || "envar".equals(qName) || "replaceable".equals(qName) || "literal".equals(qName)
            || "token".equals(qName) || "type".equals(qName) || "uri".equals(qName) || "returnvalue".equals(qName)
            || "varname".equals(qName) ||"screen".equals(qName) || "remark".equals(qName)
    );
  }

  @Override
  public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
    flushCharacters();
    if (ignored > 0 || ignoreElement(uri, qName)) {
      ++ignored;
    }
   if (replaced > 0 || replaceElement(uri, qName)) {
      ++replaced;
    }
  /**  if (ignoreElement(uri, qName)) {

    }**/

     if (replaceElement(uri, qName)) {
     try {
     String placeHolder = "Help stuff";
     char[] newChars = placeHolder.toCharArray();
     writer.write(newChars , 0, 10);
     } catch (IOException e) {
     e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
     }
     }
    if (qName.equals("xref")) {
      String intLink = "internal link";
      char[] newIntLink = intLink.toCharArray();
      try {
        writer.write(newIntLink, 0, 13);
      } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
      }
    }
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException {
    flushCharacters();
    if (ignored > 0) {
      --ignored;
    }
    if (replaced > 0) {
      --replaced;
    }
    if (qName.equals("title") || qName.equals("glossterm") || qName.equals("entry")) {
      String placeHolder = " divider term";
      char[] newChars = placeHolder.toCharArray();
      try {
        writer.write(newChars, 0, 13);
      } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
      }
    }
  }

  @Override
  public void characters(char [] data, int offset, int length) {
    chars.append(data, offset, length);
  }

  public String getResult() {

    String result = writer.toString();

    return result;
  }

  private void flushCharacters() {
    String stringData = chars.toString();
    char [] data = stringData.toCharArray();
    chars.delete(0, chars.length());
    char[] replaceChars = null;
    if (ignored > 0) {
      String vowelWord = "older holder";
      String consonantWord = "place holder";
      String placeHolder = "";
      if (data.length!=0 && vowelString.indexOf(data[0]) != -1) {
        placeHolder = vowelWord;
      } else {
        placeHolder = consonantWord;
      }
      replaceChars = placeHolder.toCharArray();
      try {
        writer.write(replaceChars, 0, 12);
      } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
      }
    } else if (replaced > 0 ) {

    } else {
      try {
        writer.write(data);
      } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
      }

    }

  }
  public InputSource resolveEntity (String name, String publicId, String baseURI, String systemId) {
    if (systemId.contains(".ent")) {
      try {
        String relativePath = systemId.substring(systemId.lastIndexOf("..")+ 3);
        String absolutePath = "c:/github/cms-7.5/documentation";
        if (absolutePath.contains("documentation" + File.separator)) {
          absolutePath = absolutePath.substring(0, absolutePath.indexOf("documentation") + 13);
        }
        String completePath = absolutePath + File.separator + relativePath;
        File entityFile = new File (completePath);
        FileReader entityReader = new FileReader(entityFile);
        InputSource entitySource = new InputSource(entityReader);
        return entitySource;
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      }
    } else {
      return null;
    }
    return null;
  }

}
