/* Banana-Chat - The first Open Source Knuddels Emulator
 * Copyright (C) 2011 - 2012 Flav <http://banana-coding.com>
 * 
 * Diese Dateien unterliegen dem Coprytight von Banana-Coding und
 * darf verändert, aber weder in andere Projekte eingefügt noch
 * reproduziert werden.
 * 
 * Der Emulator dient - sofern der Client nicht aus Eigenproduktion
 * stammt - nur zu Lernzwecken, das Hosten des originalen Knuddels Clients
 * ist auf eigene Gefahr und verstößt möglicherweise gegen Schutzrechte
 * der Knuddels.de GmbH & Co KG
 * 
 * Autoren: Flav (Grundversion), Localhost (Erweiterte Version), Kokos-Ice (Erweiterte Version)
 */



package tools;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;

import netchat.Channel;
import netchat.Client;
import netchat.CommandParser;
import netchat.Server;

import tools.database.ConnectionPool;
import tools.database.PoolConnection;

public class Reloader {
    
	
    public static void run() {
        long time = System.currentTimeMillis()/1000;   
        
        for(long zeit : Server.actions.keySet()) {
        	String[] split = Server.actions.get(zeit);
        	int seconds = Integer.parseInt(split[4]);
        	
            if ((zeit+seconds)-time <= 0) {
            	Channel channel = Server.get().getChannel(split[3]);
            	String typ = split[0];
            	Client von = Server.get().getClient(split[1]);
            	Client an = Server.get().getClient(split[2]);
            	String vonChar = von.getName().replace("<", "\\<");
            	String anChar = an.getName().replace("<", "\\<");
            	
            	if(typ.equals("kizz")) {
            		channel.broadcastPicAction(">>", String.format("%s glaubt vielleicht, ein Herpesbläschen an %s Lippe entdeckt haben. Zumindest kommt ein inniger Kuss gerade nicht in Frage!", anChar, vonChar), String.format("actNokizz_%s...h_0.mx_-0.png", CommandParser.image(an, von)));
            	} else if(typ.equals("highfive")) {
            		channel.broadcastPicAction(">>", String.format("%s ist sehr enttäuscht, weil %s nicht einschlagen möchte.", anChar, vonChar), String.format("actNoHighFive_%s...h_0.mx_-0.png", CommandParser.image(an, von)));
            	}
            	
            	//holdhands, loveletter empty
            	Server.actions.remove(zeit);
            }
        }
        
        if(Server.get().getUpdate() != 0 && (Server.get().getUpdate()+15) <= time) {
            for (Object target : Server.get().getClients().toArray()) {
                ((Client) target).disconnect();
            }

            System.exit(0);
        }
        
        PoolConnection pcon = ConnectionPool.getConnection();
        Statement ps = null;

        try {
            Connection con = pcon.connect();
            ps = con.createStatement();
            ResultSet rs = ps.executeQuery("select name,photoUploadLock, priviMessage2, priviMessage, photo,friendlist from accounts where priviMessage != 0");
            
            while(rs.next()) {
            	String nick = rs.getString("name");
            	String photo = rs.getString("photo");
            	String p = rs.getString("priviMessage2");
            	int priviMessage = rs.getInt("priviMessage");
            	int photoUploadLock = rs.getInt("photoUploadLock");
                Client target = Server.get().getClient(nick);
                boolean online = true;
                
                if (target == null) {
                    online = false;
                    target = new Client(null);
                    target.loadStats(nick);
                }
                
                if(priviMessage == 1) {
                	if(online) {
                		if(!photo.isEmpty()) {
                			if(photoUploadLock == 0) {
                				target.getChannel().broadcastAction("°BB°_>>>", String.format("_°>_h%s|/serverpp \"|/w \"<° hat ein _°>_hneues Foto hochgeladen!|/foto %s<°", target.getName().replace("<", "\\<"), target.getName().replace("<", "\\<")));
                				Server.get().query(String.format("update accounts set photoUploadLock='1' where name='%s'", target.getName()));
                			}
                		}
                		
                		target.setPhoto(photo);
                	}
                	
                	if(photoUploadLock == 0) {
                		ResultSet rs2 = ps.executeQuery("select name, friendlist from accounts where friendlist!=''");
                    
                		while(rs2.next()) {
                			String friendlist = rs2.getString("friendlist");
                    	
                			if(friendlist.contains(String.format("|%s|", nick))) {
                				String blubb = rs2.getString("name");
                				Client blu = Server.get().getClient(blubb);
                				
                				Server.get().newMessage(Server.get().getButler(), blubb, String.format("%s lädt ein neues Foto hoch!", nick), String.format("%s hat ein neues Foto hochgeladen:##_°BB>_h%ss Foto anzeigen|/foto %s<r°_##...schreib doch einen Kommentar! %s wird sich ganz bestimmt darüber freuen.", nick, nick, nick, nick), System.currentTimeMillis()/1000);
                			
                                if(blu != null) {
                                	for(Channel t : blu.getChannels()) {
                            			blu.sendButlerMessage(t.getName(), String.format("°%%-1°°BB°_°m°°>_h%s|/serverpp \"|/w \"<°°m°_°° hat dir gerade eine Nachricht (_%s lädt ein neues Foto hoch!_) geschickt. Sie liegt nun in deinem °>_hBriefkasten|/m<°.°#°°>mailclosed-outerglow.png<>--<>|/m<>--<° _°BB>Jetzt lesen|/m<r°_", Server.get().getButler().getName(), nick));
                            		}
                                }
                			}
                		}
                }
                } else if(priviMessage == 4) {
                	if(online) {
                		for(String n : p.split(",")) {
                			if(!n.isEmpty()) {
                				for(Channel c : target.getChannels()) {
                					target.sendButlerMessage(c.getName(), String.format("_°>_h%s|/serverpp \"|/w \"<°_ hat soeben einen _°>_hKommentar zu deinem Foto|/foto %s<°_ geschrieben.", n, nick));
                				}
                			}
                		}
                	}
                } else if(priviMessage == 5) {
                	target.setEmailVerify((byte) 0);
                	Server.get().newMessage(Server.get().getButler(), nick, "", String.format("Die von dir in Gang gesetzte Verifizierung der E-Mail-Adresse %s war nicht erfolgreich. Entweder hast du zu lange abgewartet um auf den in der E-Mail enthaltenen Verifizierungslink zu klicken oder der Besitzer der E-Mail-Adresse hat die Verifizierung abgelehnt.", target.getEmail()), time);
                } else if(priviMessage == 6) {
                	target.setEmailVerify((byte) 2);
                	
                	Server.get().newMessage(Server.get().getButler(), nick, "", String.format("Herzlichen Glückwunsch, du hast _erfolgreich die E-Mail-Adresse %s verifiziert_.##Solltest du zu einem späteren Zeitpunkt dein Passwort verlieren, so beantrage über die Startseite die Passwortneusetzung per E-Mail.##°R°_Ganz wichtig°r°_: Behalte dein Passwort aus Sicherheitsgründen stets für dich.", target.getEmail()), time);
                } else if(priviMessage == 7) {
                	String code = Password.generateRandom(15);
                	
                	Server.get().query(String.format("INSERT INTO `lostpassword` SET `nick` = '%s', `code` = '%s'", nick, code));
                } else if(priviMessage == 8) {
                	if(!target.getEmail().isEmpty()) {
                	}
                } else if(priviMessage == 9) {
                	Server.get().newMessage(Server.get().getButler(), target.getName(), "ThiefGame", String.format("Jemand hat dir soeben _%s Punkte_ gespendet.", p), System.currentTimeMillis()/1000);
                	target.setThiefGame(target.getThiefGame()+Integer.parseInt(p));
                }
                
                Server.get().query(String.format("update accounts set priviMessage='0',priviMessage2=''%s%s%s where name = '%s'", priviMessage == 4 && !online ? ", newPhotoComment='1'":"", priviMessage == 5 && !online ? ", emailVerify='0'":"",priviMessage == 6 && !online ? ", emailVerify='2'":"", nick));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                }
            }
            
            pcon.close();
        }
        
        for (Channel channels : Server.get().getChannels()) {
        	if(channels.getNewVoteEnd() != 0 && channels.getNewVoteEnd() <= time) {
        		VoteBox.newVoteResult(channels);
        	}
        	
        	if(channels.history.size() > 0) {
        		for(long x : channels.history.keySet()) {
        			if(x <= time-600) {
        				channels.history.remove(x);
        			}
        		}
        	}
        	
            if(channels.getPfActive()) {
            	int mitspieler = Server.countChars(channels.getPfSpieler(), '|')/2;
            	
            	if(channels.getPfStatus() == 0) {
        			channels.broadcastButlerMessage(String.format("Eine _Kissenschlacht_ wurde von _°BB>_h%s|/serverpp \"|/w \"<r°_ gestartet! Bei diesem lustigen Spiel versuchen Mitspieler, _sich gegenseitig mit Kissen zu bewerfen_.##Wer zweimal getroffen wurde, scheidet aus, _dem Gewinner_ hingegen _winkt ein °>s/24.gif<°Knuddel_!##Alle, die mitspielen wollen: _°BB>/kissen +join|\"<r°_ eingeben.", channels.getPfStarter()));
        			channels.setPfTime(time);
        			channels.setPfStatus(1);
            	} else if(channels.getPfStatus() == 1) {
            		if((channels.getPfTime()+30)-time <= 0) {
            			if(mitspieler < 3) {
            				channels.broadcastButlerMessage("Die Kissenschlacht kann leider nicht stattfinden, da nicht genug Spieler angemeldet sind.");

                			for(Client c : channels.getClients()) {
                				c.send(PacketCreator.removePrefixIcons(channels.getName()));
                			}
                			
                			channels.setPfActive(false);
                			channels.setPfSpieler("");
                			
                			channels.setPfStatus(0);
            			} else {
            				StringBuilder spieler = new StringBuilder();
            				int lala = 1;
            				String eingabe = channels.getPfSpieler().replace("||", "~").replace("|", "");
                            String[] strarr = eingabe.split("~");
                            
                            Arrays.sort(strarr);
                            for (int i = 0; i < strarr.length; i++) {
                            	spieler.append(lala!=1?", ":"").append("°>_h").append(strarr[i].replace("<", "\\<")).append("|/serverpp \"|/w \"<°");
                            	
                            	Client l = Server.get().getClient(strarr[i]);
                            	
                            	if(l == null) {
                            		l = new Client(null);
                            		l.loadStats(strarr[i]);
                            	}
                            	
                            	l.setPfLeben((byte)3);
                            	lala++;
                            }
                            
            				channels.broadcastButlerMessage(String.format("_Gleich beginnt die Kissenschlacht_. Mitspieler sind:#%s", spieler.toString()));
            				channels.setPfTime(time);
                			channels.setPfStatus(2);
            			}
            		}
            	} else if(channels.getPfStatus() == 2) {
            		if((channels.getPfTime()+5)-time <= 0) {
            			channels.broadcastButlerMessage("Kissen los! °>pf.gif<°");
            			channels.setPfTime(time);
            			channels.setPfStatus(3);
            		}
            	} else if(channels.getPfStatus() == 3) {
            		if((channels.getPfTime()+300)-time <= 0) {
            			channels.broadcastButlerMessage("Die Kissenschlacht ist _vorbei_! Es gibt _keinen Gewinner_.");
            			
            			for(Client c : channels.getClients()) {
            				c.send(PacketCreator.removePrefixIcons(channels.getName()));
            			}
            			
            			channels.setPfActive(false);
            			channels.setPfSpieler("");
            			
            			channels.setPfStatus(0);
            		}
            	}
            }
        }
    }
}
