import com.dvelop.d3.server.core.D3Interface

import javax.net.ssl.HttpsURLConnection

D3Interface d3 = getProperty( 'd3' ) as D3Interface

def LOG_PREFIX = 'taskAppMigration: '

/**
 * Angabe des Hostnamens ohne Slash am Ende.
 */
String hostname = ""

/**
 * Der API_KEY muss vor der Ausführung gesetzt werden
 **/
String API_KEY = ""
/**
 * Dieser User wird anstelle der gesperrten / nicht vorhandenen d.3-User in die wieder_vorlage geschrieben.
 * d.3 user-id:
 */
String d3ServiceUserSender = ""
String d3ServiceUserReceiver = ""

def query = """\
      SELECT DISTINCT
            wv.sender wv_user,
            ben.idp_id,
                CASE
                    WHEN sia.sid IS NOT NULL THEN 1
                    ELSE 0
                END
            ist_gesperrt
        FROM
            wieder_vorlage wv
            JOIN benutzer ben ON ben.benutzername = wv.sender
            LEFT OUTER JOIN sid_assign sia ON
                sia.auth_id = ben.benutzername
            AND
                sia.delete_flag = 0
            AND
                sia.sid = (
                    SELECT
                        sil.sid
                    FROM
                        sid_list sil
                    WHERE
                        sil.caption = 'Konto ist deaktiviert'
                )
        WHERE
                wv.wv_typ = 'W'
            AND
                wv.sender != 'd3_async'
        UNION ALL
        SELECT DISTINCT
            wv.benutzername wv_user,
            ben.idp_id,
                CASE
                    WHEN sia.sid IS NOT NULL THEN 1
                    ELSE 0
                END
            ist_gesperrt
        FROM
            wieder_vorlage wv
            JOIN benutzer ben ON ben.benutzername = wv.benutzername
            LEFT OUTER JOIN sid_assign sia ON
                sia.auth_id = ben.benutzername
            AND
                sia.delete_flag = 0
            AND
                sia.sid = (
                    SELECT
                        sil.sid
                    FROM
                        sid_list sil
                    WHERE
                        sil.caption = 'Konto ist deaktiviert'
                )
        WHERE
            wv.wv_typ = 'W'
""".stripIndent()

Closure<HttpsURLConnection> connection = { String url ->
    URL theUrl = new URL( url )
    HttpsURLConnection con = ( HttpsURLConnection ) theUrl.openConnection()
    con.addRequestProperty( 'Authorization', 'Bearer ' + API_KEY )
    con.addRequestProperty( 'Accept', 'application/json' )
    con.setDoInput( true )
    con.setDoOutput( true )
    return con
}
def rows = d3.sql.executeAndGet( query )

List<String> brokenUsers = [ ]

int gesperrt = 0
int nichtinIdp = 0
int aktiv = 0

rows.each{
    d3.log.error( LOG_PREFIX + it.wv_user + ": " + it.idp_id )
    d3.log.info( LOG_PREFIX + 'looking up ' + it.wv_user )

    if( it.ist_gesperrt ){
        gesperrt++
        if( !brokenUsers.contains( it.wv_user)){
            brokenUsers.add( it.wv_user )
        }
        d3.log.info( LOG_PREFIX + "Der user '$it.wv_user' ist gesperrt." )
        return
    }

    HttpsURLConnection con = connection( hostname + '/identityprovider/scim/users/' + it.idp_id )
    con.connect()
    if( con.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND ){
        d3.log.info( LOG_PREFIX + "Der User $it.wv_user existiert nicht als user im IDP." )
        con.disconnect()
        con = connection( hostname + '/identityprovider/scim/Groups/' + it.idp_id )
        con.connect()
        if( con.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND ){
            nichtinIdp++
            d3.log.info( LOG_PREFIX + "Der User $it.wv_user existiert nicht als Gruppe im idp." )
            if( !brokenUsers.contains( it.wv_user)){
                brokenUsers.add( it.wv_user )
            }
            con.disconnect()
        } else{
            aktiv++
            d3.log.info( LOG_PREFIX + "Der User $it.wv_user ist eine Gruppe im idp." )
        }
    } else{
        aktiv++
        d3.log.info( LOG_PREFIX + "Der User $it.wv_user ist im idp." )
    }
}

def updateUser = 'UPDATE wieder_vorlage SET benutzername = ? WHERE benutzername = ?'
def updateSender = 'UPDATE wieder_vorlage SET sender = ? WHERE sender = ?'

d3.log.info( LOG_PREFIX + "Aktualisiere Nicht-IDP-User in Tabelle wieder_vorlage...")
brokenUsers.each{
    d3.log.info( LOG_PREFIX + "Ersetze user $it in 'benutzername' durch Service-User $d3ServiceUserReceiver")
    def changed = d3.sql.execute(updateUser, [d3ServiceUserReceiver, it])
    d3.log.info( LOG_PREFIX + "Zeilen geändert: $changed")
    d3.log.info( LOG_PREFIX + "Ersetze user $it in 'sender' durch Service-User $d3ServiceUserSender")
    changed = d3.sql.execute(updateSender, [d3ServiceUserSender, it])
    d3.log.info( LOG_PREFIX + "Zeilen geändert: $changed")
}
//Zur Sicherheit noch ein Commit ausführen, wenn kein Autocommit aktiv:
d3.sql.execute( 'Commit' )

d3.log.info( LOG_PREFIX + 'Abgeschlossen.' )
d3.log.info( LOG_PREFIX + "Anzahl gesperrter User:              $gesperrt" )
d3.log.info( LOG_PREFIX + "Anzahl nicht registrierter IDP-User: $nichtinIdp" )
d3.log.info( LOG_PREFIX + "Anzahl aktiver User:                 $aktiv" )

d3.log.info( LOG_PREFIX + "Betroffene User: $brokenUsers" )
