package pl.polskalokalnie.moderation;

import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import pl.polskalokalnie.settings.AppSetting;
import pl.polskalokalnie.settings.AppSettingRepository;

/**
 * Wsiewa domyslny slownik wulgaryzmow/wyzwisk do tabeli forbidden_words dokladnie raz w zyciu bazy.
 * Dzieki temu baza jest jedynym zrodlem prawdy dla filtra tresci: brakujace slowa domyslne sa
 * dodawane niezaleznie od tego, ile slow admin juz mial, a pozniejsze usuniecia sa TRWALE
 * (po jednorazowym seedzie flaga jest ustawiona i slownik nie odradza sie przy restarcie).
 */
@Component
@Order(0)
public class ForbiddenWordSeeder implements CommandLineRunner {

    private static final String SEED_FLAG_KEY = "forbidden_words_seeded";

    private static final List<String> DEFAULT_WORDS = List.of(
            "kurwa", "kurwy", "kurwie", "kurwo", "kurwą", "kurwami", "kurwić", "kurwic", "kurwica",
            "kurwisko", "kurwiarz", "skurwysyn", "skurwysyna", "skurwysynu", "skurwysyny", "skurwiel",
            "skurwiele", "wkurwia", "wkurwiać", "wkurwiony", "pierdol", "pierdolić", "pierdolic",
            "pierdolę", "pierdole", "pierdolisz", "pierdolą", "pierdolony", "pierdolona", "pierdolone",
            "popierdolony", "rozpierdol", "rozpierdolić", "rozpierdalać", "wpierdol", "wpierdolić",
            "wpierdalać", "spierdalaj", "spierdalać", "spierdolić", "wypierdalaj", "wypierdalać",
            "wypierdolić", "zapierdalać", "zapierdala", "zapierdol", "odpierdolić", "przypierdalać",
            "chuj", "chuja", "chujowi", "chujem", "chuje", "chujek", "chujnia", "chujowy", "chujowa",
            "chujowe", "chujowo", "huj", "hujek", "hujnia", "hujowy", "pizda", "pizdy", "pizdzie",
            "pizdą", "pizdo", "pizduś", "pizdowaty", "pizdnąć", "cipa", "cipka", "cipki", "cipę",
            "cipie", "cipą", "jebać", "jebac", "jebie", "jebię", "jebiesz", "jebią", "jebany",
            "jebana", "jebane", "jebani", "jebnięty", "jebnąć", "jebnij", "dojebać", "odjebać",
            "przejebać", "wyjebać", "wyjebany", "wyjebane", "zajebać", "zajebisty", "zajebista",
            "zajebiste", "zajebiście", "najebany", "pojeb", "pojebany", "pojebana", "pojebane", "fiut",
            "fiuta", "fiuty", "kutas", "kutasa", "kutasy", "kutafon", "pała", "pały", "pałę",
            "szmata", "szmato", "szmaty", "dziwka", "dziwki", "dziwek", "suka", "suki", "suko",
            "sukinsyn", "gówno", "gowno", "gówniany", "gowniany", "gówniarz", "gowniarz", "gówniak",
            "gnojek", "gnoj", "debil", "debilu", "debile", "idiota", "idioci", "idiotka", "kretyn",
            "kretyni", "imbecyl", "imbecyle", "przygłup", "przyglup", "głupek", "glupek", "frajer",
            "frajerze", "lamus", "palant", "pajac", "baran", "osioł", "idiotyczny", "ścierwo", "scierwo"
    );

    private final ForbiddenWordRepository forbiddenWordRepository;
    private final AppSettingRepository appSettingRepository;

    public ForbiddenWordSeeder(
            ForbiddenWordRepository forbiddenWordRepository,
            AppSettingRepository appSettingRepository
    ) {
        this.forbiddenWordRepository = forbiddenWordRepository;
        this.appSettingRepository = appSettingRepository;
    }

    @Override
    public void run(String... args) {
        if (appSettingRepository.existsById(SEED_FLAG_KEY)) {
            return;
        }

        Set<String> existing = forbiddenWordRepository.findAll().stream()
                .map(word -> word.getWord().toLowerCase(Locale.ROOT))
                .collect(Collectors.toSet());

        DEFAULT_WORDS.stream()
                .distinct()
                .filter(word -> !existing.contains(word.toLowerCase(Locale.ROOT)))
                .forEach(word -> {
                    ForbiddenWord forbiddenWord = new ForbiddenWord();
                    forbiddenWord.setWord(word);
                    forbiddenWordRepository.save(forbiddenWord);
                });

        appSettingRepository.save(new AppSetting(SEED_FLAG_KEY, "true"));
    }
}
