/* 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.text.SimpleDateFormat;
import java.util.Date;

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

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

public class Cronjob {

	@SuppressWarnings("deprecation")
	public static void execute() {         
		String datum = Server.get().timeStampToDate(System.currentTimeMillis()/1000);
		String tag = new SimpleDateFormat("dd").format(new Date());
		Date dat = new Date();
    	long time = System.currentTimeMillis()/1000;
        String[] days = { "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};

        for(Channel s : Server.get().getChannels()) {
        	s.setMutes("");
        	s.setCmutes("");
        	s.setCls("");
        }
        
        Server.onlineUsers.clear();
        
        if(!Settings.getHolnick().isEmpty()) {
            Client holnick = Server.get().getClient(Settings.getHolnick());
            boolean online = true;
            
            if(holnick == null) {
            	online = false;
            	holnick = new Client(null);
            	holnick.loadStats(Settings.getHolnick());
            }
            
        	Server.get().newMessage(Server.get().getButler(), Settings.getHolnick(), "High or Low", String.format("Hallo %s,##da dein High or Low Rekord nicht geknackt wurde, erhälst du %s Knuddels! Glückwunsch!##Hochachtungsvoll,#James", Settings.getHolnick(), Settings.getHoljackpot()), time);
            
        	if(online) {
        		holnick.increaseKnuddels(Settings.getHoljackpot());
        	} else {
        		Server.get().query(String.format("update accounts set knuddels=knuddels+'%s' where name='%s'", Settings.getHoljackpot(), Settings.getHolnick()));
        	}
        	
        	Settings.setHoljackpot(0);
            Settings.setHolrunde(0);
            Settings.setHolnick("");
            //Server.get().getChannel("High or Low").setTopic("In diesem Channel kann High or Low gespielt werden. °>gt.gif<° °BB>Jetzt mitspielen!|/hol start<r°");
        }
        
        Settings.setBan("");
        
        for(Client s : Server.get().getClients()) {
        	if(s.getNotrufsperre() <= time) {
        		s.setNotrufsperre(0);
        	}

        	if(s.getSperre() <= time) {
        		s.setSperre(0);
        	}

        	if(s.getSpielsperre() <= time) {
        		s.setSpielsperre(0);
        	}

        	if(s.getWahlsperre() <= time) {
        		s.setWahlsperre(0);
        	}
        	
        	s.setAdminTime(0);
        	s.setSnp((byte)0);
        	s.setKissed((byte)0);
        	s.setWinksperre((byte)0);
        	s.setSunLock((byte)0);
        	s.setWeckMessage((byte)0);
        	s.setButterflysperre((byte)0);
        	s.setHeartMessage((byte)0);
        	s.setAnalysedatasperre((byte)0);
        	s.setCmcomments("");
        	s.setSexysperre((byte)0);
        	s.setDreamsperre((byte)0);
        	s.setStarlitesperre((byte)0);
        	s.setFriendssperre((byte)0);
        	s.setKissall((byte)0);
        	s.setKnuddelscentLock((byte) 0);
        }
        
        Server.get().query(String.format("update accounts set notrufsperre='0' where notrufsperre<='%s'", time));
        Server.get().query(String.format("update accounts set spielsperre='0' where spielsperre<='%s'", time));
        Server.get().query(String.format("update accounts set wahlsperre='0' where wahlsperre<='%s'", time));
        Server.get().query(String.format("update accounts set sperre='0' where sperre<='%s' and sperre!='1'", time));
    	Server.get().query("delete from register");
    	Server.get().query("delete from donations");
    	Server.get().query("delete from photoviews");
    	Server.get().query("update wordmixrekord set nick='', sentence='', points=NULL, seconds=NULL");
    	
    	PoolConnection pcon = ConnectionPool.getConnection();
        Statement ps = null;

        try {
            Connection con = pcon.connect();
            ps = con.createStatement();
 
            ResultSet rs = ps.executeQuery(String.format("select registration,schuetzlinge,name, career,rank,timeMonth,stammiwhen from accounts where rank>='1' and name != 'James'"));

            	String timeString = new SimpleDateFormat("M/yy").format(new Date());
            
            	if(tag.equals("01")) {
            		while(rs.next()) {
            			String name = rs.getString("name");
            			String career = rs.getString("career");
            			String stammiwhen = rs.getString("stammiwhen");
            			int rang = rs.getInt("rank");
            			int timeMonth = rs.getInt("timeMonth");
            			
            			Client n = Server.get().getClient(name);
            			
            			if(timeMonth >= 90000 || rang == 5) {
        					if(rang == 1) {
        						if(n != null) {
        							n.setRank((byte) 2);
                					n.setDate(datum);
                					n.setCareer(String.format("%s|%s Stammi|", n.getCareer(), datum));
        						} else {
        							Server.get().query(String.format("update accounts set rank='2', career='%s|%s Stammi|', date='%s' where name='%s'", career, datum, datum, name));
        						}
        					}
        					
        					if(n != null) {
            					n.setStammiwhen(String.format("%s%s%s", stammiwhen, stammiwhen.isEmpty()?"":", ", timeString));
            				} else {
            					Server.get().query(String.format("update accounts set stammiwhen='%s%s%s', stammiMonths=stammiMonths+'1' where name='%s'", stammiwhen, stammiwhen.isEmpty()?"":", ", timeString, name));
            				}
            				
            				Server.get().newMessage(Server.get().getButler(), name, "Stammi", "Herzlichen Glückwunsch,##du wurdest soeben für den kommenden Monat in die Stammis aufgenommen. Stammis haben verschiedene, zusätzliche Privilegien (Rosenversand, Wahlteilnahme, ...) mit denen ich dir viel Vergnügen wünsche.##Hochachtungsvoll,##dein James", System.currentTimeMillis()/1000);
            			} else {
            				if(rang == 2) {
            					if(n != null) {
            						n.setRank((byte) 1);
            						n.setCareer(String.format("%s|%s Familymitglied|", n.getCareer(), datum));
            						n.setDate(datum);
            					} else {
            						Server.get().query(String.format("update accounts set rank='1', career='%s|%s Familymitglied|', date='%s' where name='%s'", career, datum, datum, name));
            					}
            				}
            			
            				Server.get().newMessage(Server.get().getButler(), name, "Kein Stammi mehr", "Diesen Monat wurdest du leider nicht in die Stammis aufgenommen.##Nicht bös' drüber sein,##dein James", System.currentTimeMillis()/1000);
            			}
            		}
            	}
            	
            	rs.close();
                rs = ps.executeQuery(String.format("select name, career,mentor,registration from accounts where rank='0' and zeichen >= '10000' and onlineTime >= '60000'"));
                
                while(rs.next()) {
                	String name = rs.getString("name");
                	String career = rs.getString("career");
                	String mentor = rs.getString("mentor");
                	long registration = rs.getLong("registration");
                	
                	Client n = Server.get().getClient(name);
                	
                	if((time-registration)/86400 > 6) {
                		if(n != null) {
                			n.setRank((byte)1);
                			n.setCareer(String.format("%s|%s Familymitglied|", n.getCareer(), datum));
                			n.setDate(datum);
                		} else {
                			Server.get().query(String.format("update accounts set rank='1', career='%s|%s Familymitglied|', date='%s' where name='%s'", career, datum, datum, name));
                		}
                		
                		Server.get().newMessage(Server.get().getButler(), name, "Familymitgliedschaft", "Herzlich willkommen in der Familymitgliedschaft!##Von nun an hast du u.a. die Möglichkeit ein Herz zu verschenken, einen eigenen Channel und eine eigene Homepage anzulegen (...)##Hochachtungsvoll,#Dein James##P.S. Wähle mit _/mentor reward:NICK_ den Nick aus, der dir bei CuddlyChat bisher am meisten geholfen hat!", time);
                	
                		if(!mentor.isEmpty()) {
                			if(n != null) {
                				n.increaseMentorPoints(20);
                			} else {
                				Server.get().query(String.format("update accounts set mentorPoints=mentorPoints+'20' where name='%s'", mentor));
                			}
                			
                			Server.get().newMessage(Server.get().getButler(), mentor, "20 Mentorpunkte", String.format("Hallo %s,##da dein Schützling %s Familymitglied wurde, erhälst du _20 Mentorpunkte_!##Hochachtungsvoll,#James", mentor, name), System.currentTimeMillis()/1000);
                    	}
                	}
                }
                
                rs.close();
            	rs = ps.executeQuery(String.format("select name,adminTime,teams from accounts where teams!=''"));
                while(rs.next()) {
                	String teams = rs.getString("teams");
                	
                	StringBuilder teamsRight = new StringBuilder();
                	int cc = 1;
                	
                	for(String team : teams.split("\\|")) {
                		if(!team.isEmpty()) {
                			if(cc != 1) {
                				teamsRight.append(", ");
                			}
                			
                			teamsRight.append(team.split("~")[0]);
                		
                			cc++;
                		}
                	}
                	
                	int knuddels = ((rs.getInt("adminTime")/60)/100)*(CommandParser.countChars(teams, '|')/2);
                	String name = rs.getString("name");
                	Client n = Server.get().getClient(name);
                	
                	if(knuddels > 0) {
                		if(n != null) {
                			n.increaseKnuddels(knuddels);
                		} else {
                			Server.get().query(String.format("update accounts set knuddels=knuddels+'%s' where name = '%s'", knuddels, name));
                		}
                		
                		Server.get().newMessage(Server.get().getButler(), name, "Knuddels makes the world go around!", String.format("Hi %s,##für deinen ehrenamtlichen Einsatz erhälst du#als Dankeschön _%s_ Knuddels!##Das verdankst du deiner Mitarbeit in diesen Teams:##( %s)##Viel Vergnügen damit,##dein %s", name, knuddels, teamsRight.toString(), Server.get().getButler().getName()), time);
                	}
                }

                rs.close();
            	rs = ps.executeQuery(String.format("select name from accounts where rank>'0'"));
                while(rs.next()) {
                	String name = rs.getString("name");
                	Client n = Server.get().getClient(name);
                	int eins = Server.count(String.format("select sum(mpFriendlist) as a from accounts where mentor='%s' and mpFriendlist='1'", name));
                	int zwei = Server.count(String.format("select sum(mpChat) as a from accounts where mentor='%s' and mpChat='1'", name));
                	int gesamt = eins+zwei;

                	if(gesamt > 0) {
                		if(n != null) {
                			n.increaseMentorPoints(gesamt);
                		} else {
                			Server.get().query(String.format("update accounts set mentorPoints=mentorPoints+'%s' where name = '%s'", gesamt, name));
                		}
                		
                		Server.get().newMessage(Server.get().getButler(), name, "Mentorenpunkte", String.format("Du hast _%s Mentorenpunkte_ für deine besondere Hilfsbereitschaft erhalten.##Diese Punkte kannst du auch für Mitglieder erhalten haben, die du schon vor längerer Zeit eingeführt hast.", gesamt), time);
                	}
                	if(n != null) {
                		for(Client s : Server.get().getClients()) {
                			if(s.getMpFriendlist() == 1 && s.getMentor().equals(name)) {
                				s.setMpFriendlist((byte)2);
                			}

                			if(s.getMpChat() == 1 && s.getMentor().equals(name)) {
                				s.setMpChat((byte)2);
                			}
                		}
                	} else {
                		Server.get().query(String.format("update accounts set mpFriendlist='2' where mentor='%s' and mpFriendlist='1'", name));
                		Server.get().query(String.format("update accounts set mpChat='2' where mentor='%s' and mpChat='1'", name));
                	}
                }
                
                if(tag.equals("01")) {
                    rs.close();
                    rs = ps.executeQuery(String.format("SELECT name, word FROM toplisten where name != 'timeDay'"));
                    
                    while(rs.next()) {
                    	String name = rs.getString("name");
                    	String word = rs.getString("word");
                    	Client n = Server.get().getClient(name);
                        Statement p = con.createStatement();
                    	ResultSet r = p.executeQuery(String.format("SELECT name,career FROM accounts where name != '%s' order by %s desc limit 3", Server.get().getButler().getName(), name));
                        int platz = 1;
                        
                    	while(r.next()) {
                    		String nick = r.getString("name");
                    		String career = r.getString("career");
                    		String text = String.format("%s. Platz Top-%s im März / 2012", platz, word);
                    		
                    		if(n != null) {
                    			n.setCareer(String.format("%s|%s %s|", n.getCareer(), datum, text));
                    		} else {
                    			Server.get().query(String.format("update accounts set career='%s|%s %s|' where name='%s'", career, datum, text, nick));
                    		}
                    		
                    		Server.get().newMessage(Server.get().getButler(), nick, word, String.format("Hallo %s,##diesen Monat hast du den %s. Platz auf der Topliste %s geschafft.#Diese besondere Leistung wurde in Form eines Career Eintrags bei dir dokumentiert.##dein James", nick, platz, word), time);
                    		platz++;
                    	}
                    }
                }

                if(days[dat.getDay()].equals("Sonntag")) {
                    rs.close();
                    rs = ps.executeQuery("select name, lotto from accounts where lotto != '0' order by lotto limit 1");
                    
                    if(rs.next()) {
                    	String name = rs.getString("name");
                    	String lotto = rs.getString("lotto");
                    	int zahl = Server.get().getLottoJackpot()*2;
                    	Client n = Server.get().getClient(name);
                    	
                    	Server.get().newMessage(Server.get().getButler(), name, "Lotto-Jackpot geknackt!", String.format("Herzlichen Glückwunsch,##Du hast mit deiner Zahl %s den _Lotto-Jackpot von %s Knuddels geknackt_!#Sie wurden dir soeben gutgeschrieben.##Hochachtungsvoll,#%s", lotto, zahl, Server.get().getButler().getName()), time);
                    	
                    	if(n != null) {
                    		n.increaseKnuddels(zahl);
                    	} else {
                    		Server.get().query(String.format("update accounts set knuddels=knuddels+'%s' where name = '%s'", zahl, name));
                    	}

                    	for(Client s : Server.get().getClients()) {
                    		s.setLotto(0);
                    	}
                    	
                    	Server.get().query("update accounts set lotto='0'");
                    	Server.get().query(String.format("insert into lotto set zahl='%s',name='%s', knuddels='%s', datum='%s'", lotto, name, zahl, datum));
                    	Server.lotto.put(datum, new String[] {name, lotto, String.valueOf(zahl)});
                    	Server.get().setLottoJackpot(0);
                    }
                }
        	} catch(SQLException e) {
        		e.printStackTrace();
        	} finally {
            	if (ps != null) {
                	try {
                		ps.close();
                	} catch (SQLException e) {
                	}
            	}

            	pcon.close();
        	}
        
        	Server.sexy.clear();
        	Server.get().query("update accounts set knuddelscentLock='0',snp='0',kissed='0',winksperre='0',sunLock='0',weckMessage='0',butterflysperre='0',timeDay='0',heartMessage='0',analysedatasperre='0',cmComments='',adminTime='0',sexysperre='0',photoUploadLock='0', dreamsperre='0',starlitesperre='0', friendssperre='0',kissall='0'");

        	if(tag.equals("01")) {
        		Server.get().query("update accounts set agePlus='0',timeMonth='0',heartLock= '0', rosesSend='1',lcmonths=lcmonths+'1',lcsperre='0'");
        		
        		for(Client s : Server.get().getClients()) {
        			s.setAgePlus((byte)0);
        			s.setHeartsperre((byte)0);
        			s.setLcmonths((byte) (s.getLcmonths()+1));
        			s.setLCSperre((byte)0);
        			
        			if(s.getName().equals(Settings.getStammi())) {
            			s.setRosesSend((byte)2);
        			} else {
            			s.setRosesSend((byte)1);
        			}
        		}
        		
        		Server.get().query(String.format("update accounts set rosesSend='2' where name='%s'", Settings.getStammi()));
        	} else if(days[dat.getDay()].equals("Sonntag")) {
        		Server.get().query("update accounts set rosesSend='1',flyingbedsperre='0',bazookasperre='0'");
        		
        		for(Channel c : Server.get().getChannels()) {
        			c.setCmk(0);
        		}
        		
        		for(Client s : Server.get().getClients()) {
        			s.setFlyingbedsperre((byte)0);
        			s.setBazookasperre((byte)0);
        			
        			if(s.getName().equals(Settings.getStammi())) {
            			s.setRosesSend((byte)2);
        			} else {
            			s.setRosesSend((byte)1);
        			}
        		}
        		
        		Server.get().query(String.format("update accounts set rosesSend='2' where name='%s'", Settings.getStammi()));
        	}
        	
    		Logger.handle(null, "Cronjob successfully executed");
    		Settings.setCronjob((System.currentTimeMillis()/1000)+86400);
	}
}
