package i507;

import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
import java.util.StringTokenizer;

public class I507 {

    public static void main(String[] args) throws Exception {
        System.out.println("1. feladat:");
        ArrayList<LogLine> log = new ArrayList();//az összes megtekintés
        {
            RandomAccessFile raf = new RandomAccessFile("webstat.txt", "r");//input
            for (String sor = raf.readLine(); sor != null; sor = raf.readLine()) {
                if (!sor.equals("")) {//fájl végén néha van üres sor
                    log.add(new LogLine(sor));
                }
            }
            raf.close();
        }
        System.out.println("A beolvasott sorok száma: " + log.size());
        System.out.println("2. feladat:");
        LogLine.USERS_PER_DAY.forEach((k, v) -> System.out.println(k + "\t" + v + " látogató"));//naponta hány látogató
        System.out.println("3. feladat:");
        {
            String text = "";
            for (String brow : LogLine.BROWSERS) {//böngészők
                text += ", " + brow;
            }
            if (text.length() > 2) {//vessző levágása az elejéről
                text = text.substring(2);
                text += ".";
            } else {
                text = "nincsenek böngészők!";
            }
            System.out.println("A böngészők: " + text);
        }
        System.out.println("4. feladat:");
        {
            double sum = 0.0;//összes Chrome-os megtekintés
            for (int i : LogLine.CHROME_FROM_SITE.values()) {
                sum += i;
            }
            final double s = sum;//final hogy lehessen használni
            LogLine.CHROME_FROM_SITE.forEach((k, v) -> {
                String text = String.format("%-30s%10s", k, Math.round(v / s * 1000) / 10.0+"%");//formázás és kerekítés
                System.out.println(text);
            });
        }
        System.out.println("5. feladat:");
        {
            System.out.print("Amely címekről többször is jártak az oldalon egy adott napon:");
            String text = "";
            for (String s : LogLine.FREQUENT_IP) {
                text += ", " + s;
            }
            if (text.length() > 1) {
                text = text.substring(1);//vessző levágása (itt a szóközt nem vágja le)
                text += ".";
            }
            System.out.println(text);
        }
        System.out.println("6. feladat:");
        {
            System.out.println("Adjon meg egy IP címet");
            Scanner sc = new Scanner(System.in);//input
            String IP = sc.nextLine();
            RandomAccessFile raf = new RandomAccessFile(IP.replace(".", "_") + ".txt", "rw");
            raf.setLength(0);//ha nem üres akkor kell
            raf.seek(0);
            log.forEach((l) -> {
                try {
                    if (l.isSimilarIp(IP)) {
                        raf.writeBytes(l.date + " " + l.IP + "\n");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
            raf.close();
        }
    }

    static class LogLine {

        static final ArrayList<String> BROWSERS = new ArrayList();//böngészők, ahonnan megtekintették az oldalt (a - nem számít böngészőnek)
        static final HashMap<String, Integer> USERS_PER_DAY = new HashMap();//felhasználók száma naponta
        static final HashMap<String, Integer> CHROME_FROM_SITE = new HashMap();//Chrome böngészőt használók melyik honlapról hányszor jöttek ide
        static final HashMap<String, ArrayList<String>> IP_PER_DAY = new HashMap();//naponta a felhasználók IP címei, lehetnek ismétlések
        static final ArrayList<String> FREQUENT_IP = new ArrayList();//azok az IP-k, ahonnan egy nap többször is fölkeresték a honlapot, nincs ismétlés
        String browser;//böngésző
        String date;//dátum
        String IP;//IP cím
        String fromSite;//ahonnan elérte a honlapot

        public LogLine(String line) {
            StringTokenizer st = new StringTokenizer(line);
            browser = st.nextToken();
            if (!browser.equals("-") && !BROWSERS.contains(browser)) {//böngészők eltárolása
                BROWSERS.add(browser);
            }
            date = st.nextToken();//dátum
            USERS_PER_DAY.put(date, USERS_PER_DAY.getOrDefault(date, 0) + 1);//dátumonkénti felhasználók
            IP = st.nextToken();//IP
            if (!FREQUENT_IP.contains(IP) && IP_PER_DAY.containsKey(date)) {//ha még nem volt egy napon többször és adott napon már valaki volt az oldalon
                ArrayList<String> a = IP_PER_DAY.get(date);
                int i = a.indexOf(IP);
                if (i != -1) {//és ő is volt az oldalon
                    FREQUENT_IP.add(IP);//akkor pontosan másodjára van itt (már volt korábban, most is van, és ha többször lett volna akkor a FREQUENT_IP már tartalmazná)
                }
            }
            {
                ArrayList<String> a = IP_PER_DAY.getOrDefault(date, new ArrayList());//napi IP címek
                a.add(IP);
                IP_PER_DAY.put(date, a);
            }
            fromSite = st.nextToken();
            if (browser.equals("Chrome")) {
                CHROME_FROM_SITE.put(fromSite, CHROME_FROM_SITE.getOrDefault(fromSite, 0) + 1);//elérés statisztikája
            }
        }

        public boolean isSimilarIp(String IP) {//6. feladatban használt
            String[] s = IP.split("\\.");// a \ szükséges mert a split regular expressont használ amiben a . a tetszőleges karaktert helyettesíti, de a \ miatt 'rendes pontként' kezeli
            String[] s1 = this.IP.split("\\.");
            return s.length >= 2 && s1.length >= 2 && s[0].equals(s1[0]) && s[1].equals(s1[1]);
        }
    }
}
