#!/usr/bin/python
# -*- coding: utf-8 -*-

# --------------------------------------------------------------------------- #
#                                                                             #
#    Plugin for iSida Jabber Bot                                              #
#    Copyright (C) diSabler <dsy@dsy.name>                                    #
#                                                                             #
#    This program is free software: you can redistribute it and/or modify     #
#    it under the terms of the GNU General Public License as published by     #
#    the Free Software Foundation, either version 3 of the License, or        #
#    (at your option) any later version.                                      #
#                                                                             #
#    This program is distributed in the hope that it will be useful,          #
#    but WITHOUT ANY WARRANTY; without even the implied warranty of           #
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
#    GNU General Public License for more details.                             #
#                                                                             #
#    You should have received a copy of the GNU General Public License        #
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.    #
#                                                                             #
# --------------------------------------------------------------------------- #

AGE_DEFAULT_LIMIT = 10
AGE_MAX_LIMIT = 100
TIME_OF_LOGGING_JOINS = 1357231720

def join_time_stat(type, jid, nick, text):
    text = text.strip()
    if text and text.isdigit(): llim = int(text)
    else:
        try: llim = GT('age_default_limit')
        except: llim = AGE_DEFAULT_LIMIT
    if llim not in range(1,AGE_MAX_LIMIT): llim = AGE_DEFAULT_LIMIT
    t_age_tmp = cur_execute_fetchall(' select jid,time from first_join where room=%s and jid in (select jid from age where room=%s and status=0 order by time) order by time limit %s;',(jid,jid,llim))
    t_age = []
    for t in t_age_tmp:
        tmp = cur_execute_fetchone('select nick from age where room=%s and jid=%s order by status,-time',(jid,t[0]))
        t_age.append((tmp[0],t[1]))
    msg = L('Joins statistic:\n%s','%s/%s'%(jid,nick)) % '\n'.join(['%s\t %s%s' % (t[0],['','~'][t[1]<TIME_OF_LOGGING_JOINS],nice_time(t[1],'%s/%s'%(jid,nick))[2].split(', GMT',1)[0]) for t in t_age])
    send_msg(type, jid, nick, msg)

def join_time(type, jid, nick, text):
    if not text: text = nick
    lvl,r_jid = get_level(jid,text)
    if lvl != -2:
        j_time = cur_execute_fetchone('select time from first_join where room=%s and jid=%s;',(jid,getRoom(r_jid)))[0]
        msg = L('First %s\'s join is %s%s (%s ago)','%s/%s'%(jid,nick)) % (text,['','~'][j_time<TIME_OF_LOGGING_JOINS],nice_time(j_time,'%s/%s'%(jid,nick))[2],un_unix(int(time.time())-j_time,'%s/%s'%(jid,nick)))
    else: msg = L('Not found!','%s/%s'%(jid,nick))
    send_msg(type, jid, nick, msg)

def true_age_stat(type, jid, nick, text):
    text = text.strip()
    if text and text.isdigit(): llim = int(text)
    else:
        try: llim = GT('age_default_limit')
        except: llim = AGE_DEFAULT_LIMIT
    if llim not in range(1,AGE_MAX_LIMIT): llim = AGE_DEFAULT_LIMIT
    if base_type == 'pgsql': reqv = 'select jid,sum(age+(status = 0)::boolean::int*(%s-time)) as sum_age from age where room=%s group by jid order by sum_age desc limit %s;'
    elif base_type in ['sqlite3','mysql']: reqv = 'select jid,sum(age+(status = 0)*(%s-time)) as sum_age from age where room=%s group by jid order by sum_age desc limit %s;'
    else: return
    t_age_tmp = cur_execute_fetchall(reqv,(int(time.time()),jid,llim))
    t_age = []
    for t in t_age_tmp:
        tmp = cur_execute_fetchone('select nick from age where room=%s and jid=%s order by status,-time',(jid,t[0]))
        t_age.append((tmp[0],t[1]))
    msg = L('Age statistic:\n%s','%s/%s'%(jid,nick)) % '\n'.join(['%s\t%s' % (t[0],un_unix(t[1],'%s/%s'%(jid,nick))) for t in t_age])
    send_msg(type, jid, nick, msg)

def true_age_split(type, jid, nick, text):
    true_age_raw(type, jid, nick, text, True)

def true_age(type, jid, nick, text):
    true_age_raw(type, jid, nick, text, None)

def true_age_raw(type, jid, nick, text, xtype):
    text = text.rstrip().split('\n')
    llim = 10
    if len(text) > 1:
        try: llim = int(text[1])
        except: llim = GT('age_default_limit')
    text = text[0]
    if not text: text = nick
    if llim > GT('age_max_limit'): llim = GT('age_max_limit')
    real_jid = cur_execute_fetchone('select jid from age where room=%s and (nick=%s or jid=%s) order by -time,status',(jid,text,text.lower()))
    if not real_jid:
        text = '%%%s%%' % text.lower()
        real_jid = cur_execute_fetchone('select jid from age where room=%s and (no_case_nick ilike %s or jid ilike %s) order by -time,status',(jid,text,text))
    try:
        if xtype: sbody = cur_execute_fetchall('select * from age where room=%s and jid=%s order by -time,status limit %s',(jid,real_jid[0],llim))
        else:
            t_age = cur_execute_fetchone('select sum(age) from age where room=%s and jid=%s',(jid,real_jid[0]))
            sbody = cur_execute_fetchone('select * from age where room=%s and jid=%s order by -time,status',(jid,real_jid[0]))
            sbody = [sbody[:4] + t_age + sbody[5:]]
    except: sbody = None
    if sbody:
        msg = L('I see:','%s/%s'%(jid,nick))
        for cnt, tmp in enumerate(sbody):
            if tmp[5]: r_age = tmp[4]
            else: r_age = int(time.time()) - tmp[3] + tmp[4]
            if xtype: msg += '\n%s. %s' % (cnt + 1, tmp[1])
            else: msg += ' %s' % tmp[1]
            msg += '\t%s, ' % un_unix(r_age,'%s/%s'%(jid,nick))
            if tmp[5]:
                if tmp[6]: msg += L('%s %s ago','%s/%s'%(jid,nick)) % (tmp[6], un_unix(int(time.time() - tmp[3]),'%s/%s'%(jid,nick)))
                else: msg += L('Leave %s ago','%s/%s'%(jid,nick)) % un_unix(int(time.time() - tmp[3]),'%s/%s'%(jid,nick))
                t7sp = tmp[7].split('\r')[0]
                if t7sp.count('\n') > 3:
                    stat = t7sp.split('\n', 4)[4]
                    if stat: msg += ' (%s)' % stat
                elif t7sp: msg += ' (%s)' % t7sp
                if '\r' in tmp[7]: msg += ', %s %s' % (L('Client:','%s/%s'%(jid,nick)),' // '.join(tmp[7].split('\r')[-1].split(' // ')[:-1]))
            else: msg += L('Is here: %s','%s/%s'%(jid,nick)) % un_unix(int(time.time() - tmp[3]),'%s/%s'%(jid,nick))
            if not xtype: msg = msg.replace('\t', ' - ')
    else: msg = L('Not found!','%s/%s'%(jid,nick))
    send_msg(type, jid, nick, msg)

def seen(type, jid, nick, text):
    seen_raw(type, jid, nick, text, None)

def seen_split(type, jid, nick, text):
    seen_raw(type, jid, nick, text, True)

def seen_raw(type, jid, nick, text, xtype):
    text = text.rstrip().split('\n')
    llim = GT('age_default_limit')
    if len(text)>1:
        try: llim = int(text[1])
        except: llim = GT('age_default_limit')
    text = text[0]
    if not text: text = nick
    if llim > GT('age_max_limit'): llim = GT('age_max_limit')
    real_jid = cur_execute_fetchone('select jid from age where room=%s and (nick=%s or jid=%s) order by status,-time',(jid,text,text.lower()))
    if not real_jid:
        textt = '%%%s%%' % text.lower()
        real_jid = cur_execute_fetchone('select jid from age where room=%s and (no_case_nick ilike %s or jid ilike %s) order by status,-time',(jid,textt,textt))
    if real_jid:
        if xtype: sbody = cur_execute_fetchall('select * from age where room=%s and jid=%s order by status,-time limit %s',(jid,real_jid[0],llim))
        else: sbody = [cur_execute_fetchone('select * from age where room=%s and jid=%s order by status,-time',(jid,real_jid[0]))]
    else: sbody = None
    if sbody:
        msg = L('I see:','%s/%s'%(jid,nick))
        for cnt, tmp in enumerate(sbody):
            if xtype: msg += '\n%s. ' % (cnt+1)
            else: msg += ' '
            if text != tmp[1]: msg += L('%s (with nick: %s)','%s/%s'%(jid,nick)) % (text,tmp[1])
            else: msg += tmp[1]
            if tmp[5]:
                if tmp[6]: msg += ' - ' + L('%s %s ago','%s/%s'%(jid,nick)) % (tmp[6], un_unix(int(time.time() - tmp[3]),'%s/%s'%(jid,nick)))
                else: msg += ' - ' + L('Leave %s ago','%s/%s'%(jid,nick)) % un_unix(int(time.time() - tmp[3]),'%s/%s'%(jid,nick))
                t7sp = tmp[7].split('\r')[0]
                if t7sp.count('\n') > 3:
                    stat = t7sp.split('\n',4)[4]
                    if stat: msg += ' (%s)' % stat
                elif t7sp: msg += ' (%s)' % t7sp
                if '\r' in tmp[7]: msg += ', %s %s' % (L('Client:','%s/%s'%(jid,nick)),' // '.join(tmp[7].split('\r')[-1].split(' // ')[:-1]))
            else: msg += ' - '+ L('Is here: %s','%s/%s'%(jid,nick)) % un_unix(int(time.time()-tmp[3]),'%s/%s'%(jid,nick))
    else: msg = L('Not found!','%s/%s'%(jid,nick))
    send_msg(type, jid, nick, msg)

def seenjid(type, jid, nick, text):
    seenjid_raw(type, jid, nick, text, None)

def seenjid_split(type, jid, nick, text):
    seenjid_raw(type, jid, nick, text, True)

def seenjid_raw(type, jid, nick, text, xtype):
    text = text.rstrip().split('\n')
    llim = GT('age_default_limit')
    if len(text)>1:
        try: llim = int(text[1])
        except: llim = GT('age_default_limit')
    text = text[0]
    ztype = None
    if not text: text = nick
    if llim > GT('age_max_limit'): llim = GT('age_max_limit')
    real_jid = cur_execute_fetchall('select jid from age where room=%s and (nick ilike %s or jid ilike %s) group by jid,status,time order by status,-time',(jid,text,text.lower()))
    if not real_jid:
        txt = '%%%s%%' % text.lower()
        real_jid = cur_execute_fetchall('select jid from age where room=%s and (no_case_nick ilike %s or jid ilike %s) group by jid,status,time order by status,-time',(jid,txt,txt))
    sbody = []
    if real_jid:
        for rj in real_jid:
            if xtype: tmpbody = cur_execute_fetchall('select * from age where room=%s and jid=%s order by status, jid limit %s',(jid,rj[0],llim))
            else: tmpbody = [cur_execute_fetchone('select * from age where room=%s and jid=%s order by status',(jid,rj[0]))]
            if tmpbody:
                for t in tmpbody:
                    if t not in sbody: sbody.append(t)
    if sbody:
        ztype = True
        msg = L('I saw %s:','%s/%s'%(jid,nick)) % text
        for cnt, tmp in enumerate(sbody):
            msg += '\n%s. %s (%s)' % (cnt + 1, tmp[1], tmp[2])
            if tmp[5]:
                if tmp[6]: msg += '\t' + L('%s %s ago','%s/%s'%(jid,nick)) % (tmp[6], un_unix(int(time.time() - tmp[3]),'%s/%s'%(jid,nick)))
                else: msg += '\t' + L('Leave %s ago','%s/%s'%(jid,nick)) % un_unix(int(time.time() - tmp[3]),'%s/%s'%(jid,nick))
                t7sp = tmp[7].split('\r')[0]
                if t7sp.count('\n') > 3:
                    stat = t7sp.split('\n', 4)[4]
                    if stat: msg += ' (%s)' % stat
                elif t7sp: msg += ' (%s)' % t7sp
                if '\r' in tmp[7]: msg += ', %s %s' % (L('Client:','%s/%s'%(jid,nick)), tmp[7].split('\r')[-1])
            else: msg += '\t' + L('Is here: %s','%s/%s'%(jid,nick)) % un_unix(int(time.time() - tmp[3]),'%s/%s'%(jid,nick))
            if not xtype: msg = msg.replace('\t', ' - ')
    else: msg = L('Not found!','%s/%s'%(jid,nick))
    if type == 'groupchat' and ztype:
        send_msg(type, jid, nick, L('Send for you in private','%s/%s'%(jid,nick)))
        send_msg('chat', jid, nick, msg)
    else: send_msg(type, jid, nick, msg)

global execute

execute = [(3, 'age', true_age, 2, 'Show age of jid in conference.'),
     (3, 'age_split', true_age_split, 2, 'Show age of jid in conference splitted by nicks.'),
     (3, 'seen', seen, 2, 'Show time of join/leave.'),
     (3, 'seen_split', seen_split, 2, 'Show time of join/leave splitted by nicks.'),
     (3, 'agestat', true_age_stat, 2, 'Show age statistic for conference.'),
     (7, 'seenjid', seenjid, 2, 'Show time of join/leave + jid.'),
     (7, 'seenjid_split', seenjid_split, 2, 'Show time of join/leave + jid splitted by nicks.'),
     (3, 'when', join_time, 2, 'Show time of first join into room.'),
     (3, 'whenstat', join_time_stat, 2, 'Show statistic for time of first join into room.')]
