<%@language = "javascript" %>
<% /*
    $Revision$
    $Id$

    File:           getapptoken.asp
    Description:    Vraag een nieuw token op voor een bepaalde App
    Parameters:
    Context:
    Note:           Enigszins conform oAuth/ OpenID Connect maar daar (nog) niet
                    noodzakelijkerwijs compatible mee.

*/
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="./login.inc" -->
<!-- #include file="../api2/api2.inc" -->
<!-- #include file="../api2/model_aut_client.inc" -->
<%
    Session.Codepage = 65001; // We doen *uitsluitend* utf-8
    Response.Charset = 'utf-8';

    var client_id = getQParam("client_id");
    var device_id = getQParam("device_id", "AUTO_" + shared.random(32)); // optional device identification
                                                                         // Hetzelfde device krijgt altijd hetzelfde token terug
    var device_name = getQParam("device_name", "<unkwown>"); // Friendly name naar de gebruiker toe
    var app_version = getQParam("app_version", "<unknown>"); // Facilitor App versie
    var app_build   = getQParamInt("app_build", null); // Technische App versie
    var push_token  = getQParam("push_token", "");

    if (client_id == "FCLTAPP2" && !(S("mobile_enabled") & 2))
        shared.simpel_page(L("aut_client_denied"));

    var model_client = new model_aut_client({ internal: true });
    var client_data = api2.GET(model_client, { filter: { "code": client_id } }); // sp moet er dan zijn voor Service Provider
    if (!client_data && client_id == "FCLTAPP2") // Voor FCLTAPP2 (NativeScript app) ondersteunen we soms auto-create
    {
        // model_companies kent nog geen PUT
        var sql = "SELECT prs_s_prs_alluitvoerende_keys.nextval bedrijf_key FROM DUAL";
        var oRs = Oracle.Execute(sql);
        var bedrijf_key = oRs("bedrijf_key").Value;
        oRs.Close();
        var sql = "INSERT INTO prs_bedrijf"
                + "       (prs_bedrijf_key, prs_bedrijf_naam, prs_bedrijf_intern)"
                + " VALUES ({0},".format(bedrijf_key)
                + "         'Aareon Facilitor Mobile app',"
                + "         2)"; // Systeem bedrijf
        Oracle.Execute(sql);
        var sql = "INSERT INTO prs_bedrijfadres"
                + "       (prs_bedrijf_key,"
                + "        prs_bedrijfadres_type,"
                + "        prs_bedrijfadres_url,"
                + "        prs_bedrijfadres_privkey,"
                + "        prs_bedrijfadres_oa_scope,"
                + "        prs_bedrijfadres_authmethod)"
                + " VALUES ({0},".format(bedrijf_key)
                + "         'N',"
                + "         {0},".format(safe.quoted_sql(S("puo_app2pushurl"))) // 'https://fcm.googleapis.com/v1/projects/facilitor-165209/messages:send'
                + "         {0},".format(safe.quoted_sql(S("puo_app2secret"))) // JSONkey van ons service account
                + "         'https://www.googleapis.com/auth/firebase.messaging'," // scope
                + "         5)"; // Authmethod 5 is GoogleAuth
        Oracle.Execute(sql);
        var client_data =
        {
            "code": client_id,
            "name": "Nativescript App",
            "type": 0, // Ongedefinieerd
            "remark": "Automatisch aangemaakt voor Nativescript app",
            "secret": shared.random(32),
            "company": bedrijf_key // voor het technische adres
        }
        var result = model_client.REST_POST({}, client_data);
        client_data = api2.GET(model_client, result.key );
    }
    if (!client_data)
        shared.internal_error("Client-registration for {0} not found".format(client_id));

    var model_client_perslid = new model_aut_client_perslid({ internal: true });
    // Soms nieuwe cp_data maken. Het kan zijn dat je een ander device aan het registreren bent
    var cp_data = api2.GET(model_client_perslid, { filter: { "autclient": client_data.id, "person": user_key, "device_id": device_id } });
    if (!cp_data)
    {
        var cp_data = { "autclient"   : client_data.id,
                        "scope"       : "*",
                        "app_version" : app_version,
                        "app_build"   : app_build,
                        "device_id"   : device_id,
                        "device_name" : device_name,
                        "refreshtoken": '1$' + customerId + "_" + shared.random(32), // unused yet
                        "refreshdate" : new Date(),
                        "accesstoken" : '1$' + customerId + "_" + shared.random(32), // Does not expire yet?
                        "accessdate"  : new Date(),
                        "login"       : new Date(),
                        "person"      : user_key,
                        "pushtoken"   : push_token || (customerId + "_" + shared.random(32))
                      }
        var result = model_client_perslid.REST_POST({}, cp_data);
        // "App {0} aanmelding voor {1}/{2}";
        shared.trackaction("PRSLOG", user_key, L("lcl_client_perslid_registered").format(client_id, device_name, device_id));

        cp_data = api2.GET(model_client_perslid, result.key );
    }
    else // bestaande cp_data. Maak nieuw access token (vorige laten vervallen?)
    {
        var new_cp_data = {
                            "accesstoken" : '1$' + customerId + "_" + shared.random(32), // Does not expire yet?
                            "accessdate"  : new Date(),
                            "app_version" : app_version,    // Gewoon updaten
                            "app_build"   : app_build       // idem
                          }
        if (push_token) // Misschien een nieuwe gekregen?
        {
            new_cp_data.pushtoken = push_token;
        }
        var result = model_client_perslid.REST_PUT({}, new_cp_data, cp_data.id);
        cp_data = api2.GET(model_client_perslid, cp_data.id);
    }
    var result =
    {
        "fcltversion": FCLTVersion,
        "instance_url": HTTP.urlzelf() + "/",
        "push_token": cp_data.pushtoken,
        "device_id": cp_data.device_id,
        "access_token": cp_data.accesstoken, // JWT met SP 'FCLTAPP1'? Of JWT met IDP 'FACILITOR'?
                                             // Wel bij elke klant aan te maken dan? Of automatisch?
                                             // bearer is stateless/ single request dus geen redirect
                                             // maar via url &jwt= zou wel kunnen?
        "issued_at": Math.floor(cp_data.accessdate.getTime() / 1000)
        // "refresh_url": HTTP.urlzelf() + "/appl/aut/getapptoken.asp?client_id={0}&auth={1}".format(sp, spp_data.refreshtoken)
    }
    // een accesstoken wordt eventueel weer opgevangen in loginTry via http header X-FACILITOR-ACCESS-TOKEN

    Session("aut_client_key") = cp_data.autclient.id;
    Session("aut_client_name") = cp_data.autclient.name;

    Response.Write(JSON.stringify(result));
    Response.End;
%>
<% ASPPAGE_END(); %>
