/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package FunctionLayer;
//ps ax | grep EventNotfierDiscordBot-1.0
//kill $pid (number)
/*
screen -d -m -S nonRoot java -jar /home/sourcemodextensionstest/EventNotfierDiscordBot/EventNotfierDiscordBot-1.0.jar
screen -ls (number1)
screen -X -S (number1) quit
nohup screen -d -m -S nonroot java -jar /home/sourcemodextensionstest/EventNotfierDiscordBot/EventNotfierDiscordBot-1.0.jar
 */

import DataLayer.DataMapper;
import com.google.common.base.Stopwatch;
import com.google.common.collect.MapMaker;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import static jdk.nashorn.internal.objects.NativeRegExp.source;
import org.javacord.api.DiscordApi;
import org.javacord.api.DiscordApiBuilder;
import org.javacord.api.event.message.MessageCreateEvent;
import org.jsoup.Jsoup;

/**
 *
 * @author install1
 */
public class EventNotifier {

    //public static EventNotifier instance = new EventNotifier();
    public static final long EXPIRE_TIME_IN_SECONDS = TimeUnit.SECONDS.convert(15, TimeUnit.MINUTES);
    private static Stopwatch stopwatch = Stopwatch.createUnstarted();
    private static String eventURL = "https://unloze.com/forums/events.76/";

    private static void checkIfNewEventThread() {
        try {
            URL url = new URL(eventURL);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuffer content = new StringBuffer();
            int firstEventForZEFinder = 0;
            while ((inputLine = in.readLine()) != null) {
                content.append(inputLine).append("\n");
                if (inputLine.contains(">Event #") && inputLine.contains("data-previewUrl=\"") && firstEventForZEFinder == 0) {
                    //System.out.println("inputLine: " + inputLine);
                    boolean find = Pattern.compile(Pattern.quote("nomination"), Pattern.CASE_INSENSITIVE).matcher(inputLine).find();
                    if (!find) {
                        find = Pattern.compile(Pattern.quote("poll"), Pattern.CASE_INSENSITIVE).matcher(inputLine).find();
                        if (!find) {
                            int diff = content.length() - inputLine.length();
                            firstEventForZEFinder = diff > 0 ? diff : 0;
                        }
                    }
                }
            }
            String str = content.toString();
            String hRef = "data-previewUrl=\"";
            str = str.substring(firstEventForZEFinder);
            //System.out.println("str post firstEventForZEFinder: " + str);
            str = str.substring(0, str.indexOf(">Event #"));
            str = str.trim();
            str = str.substring(str.indexOf(hRef), str.lastIndexOf("/preview\""));
            str = str.replace(hRef, "");
            String urlFirstEvent = "https://unloze.com/" + str;
            System.out.println("urlFirstEvent: " + urlFirstEvent);
            url = new URL(urlFirstEvent);
            con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            content = new StringBuffer();
            String title = "";
            while ((inputLine = in.readLine()) != null) {
                content.append(inputLine).append("\n");
                if (inputLine.contains("Server :")) {
                    int diff = content.length() - inputLine.length();
                    firstEventForZEFinder = diff > 0 ? diff : 0;
                }
                if (inputLine.contains("<title>Event #")) {
                    title = inputLine;
                }
                if (inputLine.contains("Prize :")) {
                    break;
                }
            }
            str = content.toString();
            str = str.substring(firstEventForZEFinder);
            //System.out.println("str pre thread check: " + str);
            ConcurrentMap<Integer, String> eventContentMap = new MapMaker().concurrencyLevel(2).makeMap();
            String html2text = html2text(str);
            //System.out.println("html2text: " + html2text);
            title = html2text(title);
            title = title.substring(0, title.length() - 8);
          //  System.out.println("title: " + title);
            eventContentMap.put(eventContentMap.size(), title);
            String rewards = html2text.substring(html2text.indexOf("Prize :") + 7);
          //  System.out.println("rewards: " + rewards);
            eventContentMap.put(eventContentMap.size(), rewards);
            String leaders = html2text.substring(html2text.indexOf("Leader :") + 7, html2text.indexOf("Prize :"));
            eventContentMap.put(eventContentMap.size(), leaders);
            String date = html2text.substring(html2text.indexOf("Date :") + 6, html2text.indexOf("Time :"));
            eventContentMap.put(eventContentMap.size(), date);
            String Time = html2text.substring(html2text.indexOf("Time :") + 6, html2text.indexOf("Leader :"));
            eventContentMap.put(eventContentMap.size(), Time);
            String maps = html2text.substring(html2text.indexOf("Maps : -") + 6, html2text.indexOf("Date :"));
            if (maps.contains("CS:S Zombie Escape Server IP")){
                maps = maps.substring(maps.indexOf("Map :") + 5);
            }
            maps = maps.trim();
            System.out.println("maps: " + maps);
            if (!maps.contains("-")) {
                eventContentMap.put(eventContentMap.size(), maps);
            } else {
                String[] split = maps.split("-");
                for (String strsplit : split) {
                    eventContentMap.put(eventContentMap.size(), strsplit);
                }
            }
            //System.out.println("pre insertIntoDBEventContent");
            DataMapper.instance.insertIntoDBEventContent(eventContentMap);
            con.disconnect();
            in.close();
        } catch (MalformedURLException | ProtocolException ex) {
            Logger.getLogger(EventNotifier.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(EventNotifier.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static String html2text(String html) {
        return Jsoup.parse(html).text();
    }

    public static void main(String[] args) {
        String token = "NTI5MDIyODgwOTU3MDcxMzk5.Dwqy6w.sgbRejEzZOLdTqyqzDmktSTBDpM";
        DiscordApi api = new DiscordApiBuilder().setToken(token).login().join();
        api.addMessageCreateListener((MessageCreateEvent event) -> {
            if (stopwatch.elapsed(TimeUnit.SECONDS) >= EXPIRE_TIME_IN_SECONDS || !stopwatch.isRunning()) {
                if (!stopwatch.isRunning()) {
                    stopwatch.start();
                } else {
                    stopwatch.reset();
                }
                checkIfNewEventThread();
            }
            if (event.getMessageContent().equalsIgnoreCase("!event")) {
                try {
                    DataMapper.instance.initialization();
                    List<StringObject> EventContent = DataMapper.instance.getAllMapValues();
                    StringBuilder sb = new StringBuilder();
                    sb.append("Event Information: \n");
                    for (StringObject SO : EventContent) {
                        sb.append(SO.getEventContent()).append("\n");
                    }
                    event.getChannel().sendMessage(sb.toString());
                } catch (SQLException | IOException | CustomError ex) {
                    Logger.getLogger(EventNotifier.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }
}
