package cbd.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.resps.Tuple;

import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileNotFoundException;
 
public class B_Autocomplete {
 
	private Jedis jedis;
	public static String list = "namescsv"; //key list for users' name
	public static String file = "nomes-pt-2021.csv"; //file with names


	public B_Autocomplete() {
		this.jedis = new Jedis();
	}
 
	    public void loadNames(String input) {

            // get the file from the resources folder
            try (InputStream file = getClass().getClassLoader().getResourceAsStream(input);
                BufferedReader reader = new BufferedReader(new InputStreamReader(file, "UTF-8"))) {
    
                if (file == null) {
                    throw new FileNotFoundException("nomes-pt-2021.csv not found");
                }
                
                String line;

                while ((line = reader.readLine()) != null) {
                    String[] parts = line.split(";");
                    String name = parts[0];
                    int frequency = Integer.parseInt(parts[1]);

                    //sorted list with frequency as score
                    jedis.zadd(list, frequency, name);
                }


            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public List<String> getNames(String prefix) {
            prefix = prefix.substring(0, 1).toUpperCase() + prefix.substring(1);
            List<Tuple> allNames = jedis.zrevrangeWithScores(list, 0, -1);
            List<String> result = new ArrayList<>();

            for (Tuple pair : allNames) {
                String name = pair.getElement();
                int frequency = (int) pair.getScore();

                if (name.startsWith(prefix)) {
                    result.add(name + ", " + frequency);
                }
            }

            return result;
        }




	public static void main(String[] args) {
		B_Autocomplete auto = new B_Autocomplete();
        
		auto.jedis.del(list);
        auto.loadNames(file);

        Scanner scanner = new Scanner(System.in);
        System.out.print("Search for ('Enter for quit'): ");
        String input = scanner.nextLine();

        while (!input.isEmpty()) {
            List<String> result = auto.getNames(input);

            for (String name : result) {
                System.out.println(name);
            }
            System.out.print("Search for ('Enter for quit'): ");
            input = scanner.nextLine();
        }

        scanner.close();    
		auto.jedis.close();	
		
	}
}



