/*
 * Copyright 2017
 * Ubiquitous Knowledge Processing (UKP) Lab
 * Technische Universität Darmstadt
 *
 * Licensed 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.dkpro.core.textnormalizer.factory;

import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
import static org.junit.jupiter.api.Assertions.assertEquals;

import org.apache.uima.analysis_engine.AnalysisEngine;
import org.apache.uima.analysis_engine.AnalysisEngineDescription;
import org.apache.uima.fit.factory.AggregateBuilder;
import org.apache.uima.jcas.JCas;
import org.apache.uima.resource.ExternalResourceDescription;
import org.dkpro.core.frequency.resources.Web1TFrequencyCountResource;
import org.dkpro.core.textnormalizer.ReplacementFileNormalizer.SrcSurroundings;
import org.dkpro.core.textnormalizer.ReplacementFileNormalizer.TargetSurroundings;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

import de.tudarmstadt.ukp.dkpro.core.api.metadata.type.DocumentMetaData;

public class NormalizerFactoryTest
{
    private ExternalResourceDescription frequencyProvider;

    @BeforeEach
    public void init() {
        frequencyProvider = createResourceDescription(
                Web1TFrequencyCountResource.class,
                Web1TFrequencyCountResource.PARAM_LANGUAGE, "de",
                Web1TFrequencyCountResource.PARAM_MIN_NGRAM_LEVEL, "1",
                Web1TFrequencyCountResource.PARAM_MAX_NGRAM_LEVEL, "1",
                Web1TFrequencyCountResource.PARAM_INDEX_PATH, "src/test/resources/jweb1t");  
    }

    @Disabled("This test will not work while the module is in transition - after we need to fix it")
    @Test
    public void testNormalizerFactory() throws Exception
    {
        test("GMBH +++ Gewerkschaftb +++ HDL +++ :-)",
                "GmbH +++ Gewerkschaft +++ Hab' dich lieb +++  lächeln ");
    }    


    public void test(String input, String output) throws Exception
    {
        NormalizerFactory nf = new NormalizerFactory();
        AnalysisEngineDescription normalizeSharpSUmlaute = nf
                .getUmlautSharpSNormalization(frequencyProvider, 0);
        AnalysisEngineDescription normalizeRepitions = nf
                .getExpressiveLengtheningNormalization(frequencyProvider);
        AnalysisEngineDescription normalizeCapitalization = nf
                .getCapitalizationNormalization(frequencyProvider);
        AnalysisEngineDescription normalizeInternetslang = nf.getReplacementNormalization(
                "src/main/resources/replaceLists/internetslang.txt",
                SrcSurroundings.ONLY_ALPHANIMERIC, TargetSurroundings.NOTHING);
        AnalysisEngineDescription normalizeSpelling = nf
                .getSpellcorrection("src/test/resources/dictionary/ngerman");
        AnalysisEngineDescription normalizeEmoticons = nf.getReplacementNormalization(
                "src/main/resources/replaceLists/emoticons_de.txt", SrcSurroundings.IRRELEVANT,
                TargetSurroundings.WHITESPACE);
    
        AggregateBuilder ab = new AggregateBuilder();    
        ab.add(normalizeSharpSUmlaute);
        ab.add(normalizeRepitions);
        ab.add(normalizeCapitalization);
        ab.add(normalizeInternetslang);
        ab.add(normalizeSpelling);
        ab.add(normalizeEmoticons);
    
        AnalysisEngine engine = ab.createAggregate();
        JCas jcas = engine.newJCas();
        jcas.setDocumentText(input);    
        DocumentMetaData.create(jcas);
        engine.process(jcas);
    
        JCas view0 = jcas.getView("_InitialView");
        JCas view1 = jcas.getView("view1");
        JCas view2 = jcas.getView("view2");
        JCas view3 = jcas.getView("view3");
        JCas view4 = jcas.getView("view4");
        JCas view5 = jcas.getView("view5");
        JCas view6 = jcas.getView("view6");
    
        System.out.println("Original       :" + view0.getDocumentText());    
        System.out.println("Umlaute        :" + view1.getDocumentText());
        System.out.println("Repitions      :" + view2.getDocumentText());
        System.out.println("Capitalization :" + view3.getDocumentText());
        System.out.println("Internetslang  :" + view4.getDocumentText());
        System.out.println("Spelling       :" + view5.getDocumentText());
        System.out.println("Emoticons      :" + view6.getDocumentText());
        System.out.println("Perfect        :" + output);
    
        assertEquals(output, view6.getDocumentText());
    }
}
