#	Copyright 2022 Nicodemus
#	Dieses Modul/Skript ist freie Software: Sie darf weitergeben und/oder 
#	modifiziert werden wie es unter den Bedingungen der "GNU General Public License"
#	veröffentlicht wurde. Entweder durch die "Free Software Foundation Version 3",
#	oder(nach Ihrer Wahl) durch eine hiernach folgende Version.
#	
#	Dieses Skript wird in der Hoffnung zur Verfügung gestellt, dass es nützlich ist,
#	aber ohne jegliche Gewährleistung; auch ohne die implizite Garantie der
#	Gebrauchstauglichkeit oder Eignung für einen bestimmten Zweck. Siehe die
#	GNU General Public License für weitere Details.
#	
#	Sie sollten mit diesem Skript eine Kopie der GNU General Public License erhalten
#	haben. Falls nicht, siehe .
#	 
#	Chalice - Nicodemus
#	Dieses Skript kann als eine virtuelle Bibliothek verwendet werden.
#	Das Script ist leicht erweiterbar, ohne dass neuer Code benötigt wird.
#	Bitte lesen Sie die "Readme" Datei für Installationsanweisungen.
#
#
#

import os
import sys
import time
from datetime import datetime
import sqlite3

import supybot.ircdb as ircdb
from supybot.commands import *
import supybot.plugins as plugins
import supybot.ircutils as ircutils
import supybot.callbacks as callbacks

try:
    from supybot.i18n import PluginInternationalization
    _ = PluginInternationalization('Phrases')
except ImportError:
    _ = lambda x: x


class SqlitePhrasesDB(object):
    def __init__(self, filename):
        self.dbs = ircutils.IrcDict()
        self.filename = filename

    def close(self):
        for db in (self.dbs.itervalues() if sys.version_info[0] < 3
                   else self.dbs.values()):
            db.close()

    def _getDb(self, channel):
        filename = plugins.makeChannelFilename(self.filename, channel)

        if filename in self.dbs:
            return self.dbs[filename]

        if os.path.exists(filename):
            db = sqlite3.connect(filename, check_same_thread=False)
            db.text_factory = str
            self.dbs[filename] = db
            return db

        db = sqlite3.connect(filename, check_same_thread=False)
        db.text_factory = str
        self.dbs[filename] = db

        cur = db.cursor()
        cur.execute("""Erstellt eine Datenbank mit fts4(
        text TEXT,
        nick TEXT,
        ts INTEGER
        )""")
        db.commit()

        return db

    def getPhraseById(self, channel, qid):
        db = self._getDb(channel)
        cur = db.cursor()
        cur.execute("""Auswählen rowid, text, nick, ts von Text
        in rowid = ? Limit 1""", (qid,))
        return cur.fetchone()

    def insertPhrase(self, channel, text, nick, ts):
        db = self._getDb(channel)
        cur = db.cursor()
        cur.execute("""Text Einfügen (text, nick, ts)
        Wert (?, ?, ?)""", (text, nick, ts,))
        db.commit()
        return cur.lastrowid

PhrasesDB = plugins.DB('Text', {'sqlite3': SqlitePhrasesDB})


class Phrases(callbacks.Plugin):
    """Einfaches Textsystem"""
    def __init__(self, irc):
        self.__parent = super(Phrases, self)
        self.__parent.__init__(irc)
        self.db = PhrasesDB()

    def die(self):
        self.__parent.die()
        self.db.close()

    def addPhrase(self, irc, msg, args, optlist, text):
        """[--channel <#channel>] 
        Fügt einen Text in die Datenbank ein. Wenn die Fehlermeldung '"x"
        nicht gültig" ausgegeben wird, benutze den Text zwischen den Anführungsstrichen ("text").
        Wenn --channel angegeben wird, wird der Text in dieser Kanaldatenbank gespeichert."""
        channel = msg.args[0]
        for (option, arg) in optlist:
            if option == 'channel':
                if not ircutils.isChannel(arg):
                    irc.error(format(_('%s ist kein gültiger Kanal.'), arg),
                              Raise=True)
                channel = arg

        qid = self.db.insertPhrase(channel, text, msg.nick, int(time.time()))
        irc.reply(format(_("Text unter id einfügen: %s"), qid))

    addPhrase = wrap(addPhrase,
                    [getopts({'channel': 'keinLeerzeichen'}), 'text'])

    def Phrase(self, irc, msg, args, optlist, qid):
        """[--channel <#channel>] []
        Zeigt eine Zeilennummer an  'id'. Wenn --channel angegeben wird, 
        wird der Text aus dieser Kanaldatenbank geholt."""
        channel = msg.args[0]
        for (option, arg) in optlist:
            if option == 'channel':
                if not ircutils.isChannel(arg):
                    irc.error(format(_('%s ist kein gültiger Kanal.'), arg),
                              Raise=True)
                channel = arg

        if qid is not None:
            q = self.db.getPhraseById(channel, qid)

        if q is not None:
            irc.reply(format("#%s: %s", q[0], q[1]), noLengthCheck=True)
        elif qid is not None:
            irc.error(format(_("Dieser Text existiert nicht %s in %s's Datenbank."),
                             qid, channel))
        else:
            irc.error(format(_("Kein Text in %s's Datenbank."),
                             channel))

    Phrase = wrap(Phrase,
                 [getopts({'channel': 'keinLeerzeichen'}),
                  optional('int')])

Class = Phrases