package de.duehl.basics.replacements;

/*
 * Copyright 2026 Christian Dühl. All rights reserved.
 *
 * This program is free software. You can redistribute it and/or
 * modify it under the same terms as perl:
 *
 * general:  http://dev.perl.org/licenses/
 * GPL:      http://dev.perl.org/licenses/gpl1.html
 * artistic: http://dev.perl.org/licenses/artistic.html
 */

import static org.junit.Assert.*;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;

import de.duehl.basics.collections.CollectionsHelper;

public class PlaceholderResolverTest {

    private static final String VERTRAGSNAME_REPLACE_FRONT_PART = "contract_name";
    private static final String DATE_REPLACE_FRONT_PART = "date";
    private static final String COMPANY_NAME_REPLACE_FRONT_PART = "company-name";
    private static final String TOWN_REPLACE_FRONT_PART = "town";

    /**
     * Matched einen Platzhalter für einen Vertragsnamen in der Form <<company-name:1>> und fängt
     * die Nummer.
     */
    private static final String VERTRAGSNAME_REGEX =
            createPlaceholderRegex(VERTRAGSNAME_REPLACE_FRONT_PART);

    /** Matched einen Platzhalter für ein Datum in der Form <<date:1>> und fängt die Nummer. */
    private static final String DATE_PLACEHOLDER_REGEX =
            createPlaceholderRegex(DATE_REPLACE_FRONT_PART);

    /**
     * Matched einen Platzhalter für einen Unternehmensnamen in der Form <<company-name:1>> und
     * fängt die Nummer.
     */
    private static final String COMPANY_NAME_PLACEHOLDER_REGEX =
            createPlaceholderRegex(COMPANY_NAME_REPLACE_FRONT_PART);

    /** Matched einen Platzhalter für einen Ort in der Form <<town:1>> und fängt die Nummer. */
    private static final String TOWN_PLACEHOLDER_REGEX =
            createPlaceholderRegex(TOWN_REPLACE_FRONT_PART);

    private static String createPlaceholderRegex(String replaceFrontPart) {
        return "<<" + replaceFrontPart + ":" + "(\\d+)" + ">>";
    }

    /** Ein regulärer Ausdruck für einen Satzanfang in der Art "Die Gesellschaft". */
    private static final String DIE_GESELLSCHAFT_REGEX = ""
            + "(?:"
            +         "Die Gesellschaft"
            +     "|"
            +         "Das Unternehmen"
            + ")"
            ;

    private static final String AM_VOM_REGEX = ""
            + "(?:"
            +         "am"
            +     "|"
            +         "(?:durch Beschluss )?vom"
            + ")"
            ;

    private static final String AM_IN_SPACES_REGEX = ""
            + " (?:(?:hat|ist|wurde) )?" + AM_VOM_REGEX + " "
            ;

    private static final String MIT_SITZ_IN_REGEX = ""
            + "(?:"
            +         " (?:(?:- )?mit (?:dem )?Sitz )?in "
            +     "|"
            +         ", "
            + ")"
            ;

    private static final String GESCHLOSSEN_REGEX = ""
            + "(?:ab)?geschlossene?(?: worden)?";


    @Test
    public void test1() {
        /*
         * Das Amtsgericht habe ich für diesen Test weggelassen, weil man dafür die Klasse
         * AmtsgerichtInformation aus dem HR-Projekt benötigt.
         */
        /*
        String originalSentence = ""
                + "Die Gesellschaft hat am 15.01.2019 mit der Gottschalk Feuerschutzanlagen GmbH "
                + "mit dem Sitz in Minden einen Gewinnabführungsvertrag geschlossen.";
        */
        String sentence = ""
                + "Die Gesellschaft hat am <<date:1>> mit der <<company-name:1>> mit dem Sitz in "
                + "<<town:1>> einen <<contract_name:1>> geschlossen.";
        String regex = ""
                + DIE_GESELLSCHAFT_REGEX
                + AM_IN_SPACES_REGEX
                + DATE_PLACEHOLDER_REGEX
                + " mit der "
                + COMPANY_NAME_PLACEHOLDER_REGEX
                + MIT_SITZ_IN_REGEX
                + TOWN_PLACEHOLDER_REGEX
                + " einen "
                + VERTRAGSNAME_REGEX
                + " "
                + GESCHLOSSEN_REGEX
                + "\\."
                ;
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(sentence);
        boolean matches = matcher.matches();
        assertTrue(matches);

        PlaceholderResolver resolver = new PlaceholderResolver();
        resolver.setDebug(false);

        List<String> dates = CollectionsHelper.buildListFrom("15.01.2019");
        List<String> companyNames = CollectionsHelper.buildListFrom(
                "Gottschalk Feuerschutzanlagen GmbH");
        List<String> towns = CollectionsHelper.buildListFrom("Minden");
        List<String> vertragsnamen = CollectionsHelper.buildListFrom("Gewinnabführungsvertrag");

        String date = resolver.resolve("Datum", dates, matcher, 1);
        String companyName = resolver.resolve("Firmenname", companyNames, matcher, 2);
        String town = resolver.resolve("Ort", towns, matcher, 3);
        String vertragsname = resolver.resolve("Vertragsname", vertragsnamen, matcher, 4);

        assertEquals("15.01.2019", date);
        assertEquals("Gottschalk Feuerschutzanlagen GmbH", companyName);
        assertEquals("Minden", town);
        assertEquals("Gewinnabführungsvertrag", vertragsname);
    }

}
