/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.uima.ruta.caseditor.view.html;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.commons.lang3.StringUtils;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.impl.XmiCasDeserializer;
import org.apache.uima.caseditor.editor.AnnotationEditor;
import org.apache.uima.caseditor.editor.ICasDocument;
import org.apache.uima.caseditor.editor.ICasEditorInputListener;
import org.apache.uima.resource.ResourceInitializationException;
import org.apache.uima.resource.metadata.TypeSystemDescription;
import org.apache.uima.resource.metadata.impl.TypeSystemDescription_impl;
import org.apache.uima.ruta.caseditor.RutaCasEditorPlugin;
import org.apache.uima.util.CasCreationUtils;
import org.apache.uima.util.FileUtils;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.Page;
import org.xml.sax.SAXException;

public class HtmlViewPage extends Page implements ICasEditorInputListener {

  private AnnotationEditor editor;

  private Browser browser;

  public HtmlViewPage(AnnotationEditor editor) {
    super();
    this.editor = editor;
  }

  @Override
  public void init(IPageSite pageSite) {
    super.init(pageSite);
  }

  @Override
  public void createControl(Composite parent) {
    Composite composite = parent;

    browser = new Browser(composite, SWT.NONE);
    updateHtml();
    getSite().setSelectionProvider(new ISelectionProvider() {

      public void setSelection(ISelection selection) {

      }

      public void removeSelectionChangedListener(ISelectionChangedListener listener) {

      }

      public ISelection getSelection() {
        return null;
      }

      public void addSelectionChangedListener(ISelectionChangedListener listener) {

      }
    });
    editor.addCasEditorInputListener(this);
    browser.refresh();
  }

  @Override
  public void setFocus() {
  }

  @Override
  public void dispose() {
    browser.dispose();
    editor.removeCasEditorInputListener(this);
  }

  public void casDocumentChanged(IEditorInput oldInput, ICasDocument oldDocument,
          IEditorInput newInput, ICasDocument newDocument) {
    updateHtml();
  }

  @Override
  public Control getControl() {
    return browser;
  }

  private void updateHtml() {
    if (editor == null) {
      return;
    }
    IPreferenceStore store = RutaCasEditorPlugin.getDefault().getPreferenceStore();
    String htmlSource = store.getString(HtmlView.HTML_SOURCE);
    if (StringUtils.isBlank(htmlSource)) {
      setHtmlWithEditor();
    } else {
      IEditorInput editorInput = editor.getEditorInput();
      if (editorInput instanceof FileEditorInput) {
        FileEditorInput fei = (FileEditorInput) editorInput;
        String name = fei.getFile().getName();
        String[] split = name.split("[.]");
        File dir = new File(htmlSource);
        File[] listFiles = dir.listFiles();
        File selected = null;
        for (File file : listFiles) {
          String[] split2 = file.getName().split("[.]");
          if(split[0].equals(split2[0])) {
            selected = file;
            break;
          }
        }
        if(selected == null) {
          setHtmlWithEditor();
          return;
        }
        try {
          String html = "";
          if (selected.getName().endsWith(".html") || selected.getName().endsWith(".txt")) {
            html = FileUtils.file2String(selected);
          } else if(selected.getName().endsWith(".xmi")){
            try {
              TypeSystemDescription tsd = new TypeSystemDescription_impl();
              CAS dummyCas = CasCreationUtils.createCas(tsd, null, null);
              XmiCasDeserializer.deserialize(new FileInputStream(selected), dummyCas, true);
              html = dummyCas.getDocumentText();
              dummyCas.release();
            } catch (ResourceInitializationException e) {
              RutaCasEditorPlugin.error(e);
            } catch (SAXException e) {
              RutaCasEditorPlugin.error(e);
            }
          }
          browser.setText(html);
          browser.refresh();
        } catch (IOException e) {
          RutaCasEditorPlugin.error(e);
        }
      }
    }
  }

  private void setHtmlWithEditor() {
    CAS cas = editor.getDocument().getCAS();
    String html = cas.getDocumentText();
    browser.setText(html);
    browser.refresh();
  }

}
