package com.mrsl1d3r.wordle.logica;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import com.mrsl1d3r.wordle.filtro.FiltroPerLunghezza;

/**
 * Classe per gestire un vocabolario di parole.
 * Consente l'aggiunta di parole e il caricamento da file di testo.
 *
 * @version 1.0
 * @author Angelo Ciausu
 */
public class Vocabolario {
    private String[] parole;
    private int num;

    /**
     * Costruttore che inizializza il vocabolario con capacità iniziale.
     */
    public Vocabolario(){
        parole = new String[100];
        num = 0;
    }

    /**
     * Aggiunge una parola al vocabolario se non è già presente
     *
     * @param parola La parola da aggiungere
     */

    public void add(String parola, int lunghezza) {
        // Converti la parola in minuscolo e rimuovi spazi
        parola = parola.toLowerCase().trim();

        // Crea un'istanza del filtro per lunghezza
        FiltroPerLunghezza filtro = new FiltroPerLunghezza(lunghezza);

        // Controlla se la lunghezza della parola corrisponde alla lunghezza specificata usando il filtro
        if (filtro.accetta(parola) && !presente(parola)) {
            // Ridimensiona l'array se pieno
            if (num == parole.length) {
                String[] newParole = new String[num * 2];
                System.arraycopy(parole, 0, newParole, 0, num);
                parole = newParole;
            }
            parole[num++] = parola;
        }
    }

    /**
     * Verifica se una parola è già presente nel vocabolario.
     *
     * @param parola La parola da cercare
     * @return true se la parola è presente, false altrimenti
     */
    private boolean presente(String parola) {
        for (int i = 0; i < num; i++) {
            if (parole[i].equals(parola)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Carica le parole da un file di testo.
     *
     * @param nomeFile Il percorso del file da leggere
     */
    public void caricaDaFile(String nomeFile) {
        try (BufferedReader reader = new BufferedReader(new FileReader(nomeFile))) {
            String riga;
            while ((riga = reader.readLine()) != null) {
                // Rimuovi punteggiatura e converti in minuscolo
                String[] words = riga.replaceAll("[^a-zA-Z\\s]", "")
                        .toLowerCase()
                        .split("\\s+");
                for (String word : words) {
                    if (!word.isEmpty()) {
                        add(word, word.length()); // Passa la lunghezza della parola come secondo argomento
                    }
                }
            }
        } catch (IOException e) {
            System.err.println("Errore nella lettura del file: " + e.getMessage());
        }
    }

    /**
     * Restituisce una rappresentazione in stringa del vocabolario.
     *
     * @return Stringa contenente tutte le parole
     */
    public String toString(){
        StringBuilder s = new StringBuilder();
        for (int i = 0; i < num; i++) {
            s.append(parole[i]).append(" "); // Aggiungi spazio tra le parole
        }
        return s.toString().trim(); // Rimuovi spazio finale                                                                                                                      1
    }

    /**
     * Restituisce il numero di parole nel vocabolario.
     *
     * @return Il numero di parole
     */
    public int size(){
        return num;
    }
}