ONO::FW::Edu::Apps::Modules::Test

package ONO::FW::Edu::Apps::Modules::Test;
################################################################################
# COPYRIGHT / LICENSE #
################################################################################
#
# This file is part of the ONO Software Project.
#
# Copyright (C) 2022-2026 Jos Kirps and The Joopita Project [ASBL]
# Copyright (C) 2011-2022 Jos Kirps and Joopita Research ASBL
# Copyright (C) 2006-2011 Jos Kirps and The Joopita Project
# Copyright (C) 2001-2006 Jos Kirps and The WobbleWolf Project
#
# This file, as well as many other parts of the ONO Software Project or
# related elements, are FREE SOFTWARE available under the ARTISTIC LICENSE 2.0.
#
# 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.
#
# For the full license, see /ono/osr/license/LICENSE.txt, or write to
# jos_AT_kirps_DOT_com or contact_AT_joopita_DOT_com.
#
################################################################################
# END OF COPYRIGHT / LICENSE, HERE COMES THE CODE ... #
################################################################################

#: This module is a front end application module wrapper that has been
#: created for the Morzino Project (morzino.com) and that has been released
#: as Open Source software.
#:
#: Note that this is NOT a self-contained application, it is only a wrapper
#: that makes heavy use of the ONO Perl Framework application engine.

use strict;

use ONO::FW::Edu::Apps::ToolBox;

use Encode;

use ONO::ToolBox::Auth;
use ONO::Lib::Lang::LangKitEdu;

use ONO::FW::Apps::Core;
use ONO::FW::Apps::Core::Graphics;

use ONO::FW::User::Init;
use ONO::IO;
use ONO::FW::Apps::PDF;

use ONO::Lib::Web::Client;
use ONO::Core::Version;
use ONO::FW::Edu::ToolBox;

sub test {

my (
$self,
$option,
$vars_ref,
$HTTP,
$BASE,
) = @_;

###################################################################
# INIT - BEGIN
###################################################################

my (
$db,
$community,
$action_url,
$form,
$format,
$canvas,
$pdfkey,
$sec,$min,$hour,
$mday,$mon,$year,
$wday,$yday,$timestamp,
$lang,
$BLK_ref,
$vars_ref,
) = ONO::FW::Apps::Core->init($vars_ref);

my %vars = %$vars_ref;
my %BLK = %$BLK_ref;

ONO::FW::Apps::Core->now("","test",$vars{'app_lang'});

my $WEB;

my $AppName = "Test";

###################################################################
# NORMAL TEST MODE
###################################################################

my (
$status,$os_status,$browser_status,
$os,$os_ver,$os_info,
$browser,$browser_ver,$browser_info,
) = ONO::Lib::Web::Client->client();

my %INFO;

my @txts = (
"Server and software",
"ONO software platform is up and running on the server.",
"Anonymous session",
"User '$vars{'username'}' is online",
"you are not logged in",
"you are logged in",

"Virtual Classroom has been authenticated",
);
if ($vars{'app_lang'} eq "de" || $vars{'app_lang'} eq "lu") {
@txts = (
"Server und Software",
"ONO Software Platform läuft auf dem Server und ist online.",
"Anonyme Session",
"Benutzer '$vars{'username'}' ist online",
"du bist nicht eingeloggt",
"du bist eingeloggt",

"Virtuelle Klasse wurde authentifiziert",
);
}
if ($vars{'app_lang'} eq "fr") {
@txts = (
"Serveur et logiciels",
"La plate-forme logicielle ONO est opérationnelle et en ligne sur le serveur.",
"Session anonyme",
"Utilisateur '$vars{'username'}' est en ligne",
"vous n'êtes pas connecté",
"vous êtes connecté",

"Classe Virtuelle a été authentifiée",
);
}

my @msgs = ONO::Lib::Web::Client->client_osweb_msgs($vars{'app_lang'});

$INFO{'main_icon'} = "ono/smiley_green";
$INFO{'main_text'} = qq~<td class="lightgreen bold">$msgs[1]</td>~;

if ($status) {
$INFO{'main_icon'} = "ono/smiley_yellow";
$INFO{'main_text'} = qq~<td class="orange bold">$msgs[2]</td>~;
if ($status == 2) {
$INFO{'main_icon'} = "ono/smiley_red";
$INFO{'main_text'} = qq~<td class="lightred bold">$msgs[3]</td>~;
}
}

$INFO{'os_icon'} = "ono/smiley_green";
$INFO{'os_text'} = qq~<td class="lightgreen">$msgs[4]</td>~;

if ($os_status) {
$INFO{'os_icon'} = "ono/smiley_yellow";
$INFO{'os_text'} = qq~<td class="orange">$msgs[5]</td>~;
if ($os_status == 2) {
$INFO{'os_icon'} = "ono/smiley_red";
$INFO{'os_text'} = qq~<td class="lightred">$msgs[6]</td>~;
}
}

$INFO{'web_icon'} = "ono/smiley_green";
$INFO{'web_text'} = qq~<td class="lightgreen">$msgs[7]</td>~;

if ($browser_status) {
$INFO{'web_icon'} = "ono/smiley_yellow";
$INFO{'web_text'} = qq~<td class="orange">$msgs[8]</td>~;
if ($browser_status == 2) {
$INFO{'web_icon'} = "ono/smiley_red";
$INFO{'web_text'} = qq~<td class="lightred">$msgs[9]</td>~;
}
}

$INFO{'ono_icon'} = "ono/smiley_green";
$INFO{'ono_text'} = $txts[1];

my @ono_data = ONO::Core::Version->ver();
my $ono_info = "ONO $ono_data[0], revision $ono_data[1]";

my $MSIE_WARNING;
if ($browser eq "MSIE") {
$MSIE_WARNING .= qq~<tr>
<td><img class="block24 mr5" src="$BASE/ono/osr/images/icons/crystal/32x32/ono/smiley_yellow.png" alt=""></td>
<td class="orange">
<div class="lh125">
$msgs[10]
$msgs[11]
</div>
</td>
</tr>
~;
}

# my $VIRCLASS;
# my ($AUTH_ID) = ONO::FW::Edu::Apps::ToolBox->virclass_auth($community);
# if ($AUTH_ID) {
#
# my ($AUTH_ID2) = ONO::FW::Edu::ToolBox->virclass_auth($db,$community,"I");
# my $COMP_ID;
# if ($AUTH_ID2 =~ /^$AUTH_ID:(.*?)$/) {
# $COMP_ID = ", $BLK{'Computer'} ID: $1";
# }
#
# $VIRCLASS = qq~, <span class="bold">$txts[6] ($BLK{'Virclass'} ID: #$AUTH_ID$COMP_ID)</span>~;
# }

$INFO{'user_icon'} = qq~<img class="block32 mr5" src="$BASE/ono/osr/images/icons/crystal/32x32/kdm/user_male.png" alt="">~;
# $INFO{'user_text'} = qq~<td class="orange"><span class="bold">$txts[2]</span> ($txts[4])$VIRCLASS.</td>~;
$INFO{'user_text'} = qq~<td class="orange"><span class="bold">$txts[2]</span> ($txts[4]).</td>~;
$INFO{'user_info'} = qq~<td class="orange">$txts[4].</td>~;

if ($vars{'username'}) {
# $INFO{'user_text'} = qq~<td class="lightgreen"><span class="bold">$txts[3]</span> ($txts[5])$VIRCLASS.</td>~;
$INFO{'user_text'} = qq~<td class="lightgreen"><span class="bold">$txts[3]</span> ($txts[5]).</td>~;
$INFO{'user_info'} = qq~<td class="lightgreen">$txts[5].</td>~;

my ($img) = ONO::FW::User::Init->getuserimage($vars{'username'});
if (ONO::IO->exists($img)) {
$INFO{'user_icon'} = ONO::FW::User::Init->profileimage($vars{'username'},32);
}

}

my $device = ONO::IO->device();

$WEB .= qq~<div class="p20">
<table class="default_table">
<tr>
<td>$INFO{'user_icon'}</td>
$INFO{'user_text'}
</tr>
<tr>
<td></td>
<td class="p5"></td>
</tr>
<tr>
<td><img class="block32 mr5" src="$BASE/ono/osr/images/icons/crystal/32x32/$INFO{'main_icon'}.png" alt=""></td>
$INFO{'main_text'}
</tr>
<tr>
<td></td>
<td>
<table class="default_table">
<tr>
<td><img class="block24 mr5" src="$BASE/ono/osr/images/icons/crystal/32x32/$INFO{'os_icon'}.png" alt=""></td>
$INFO{'os_text'}
</tr>
<tr>
<td></td>
<td><div class="col9 ml20">$os_info<span id="ono_os_info_add"></span></div></td>
</tr>
<tr>
<td><img class="block24 mr5" src="$BASE/ono/osr/images/icons/crystal/32x32/$INFO{'web_icon'}.png" alt=""></td>
$INFO{'web_text'}
</tr>
<tr>
<td></td>
<td>
<div id="test_browser_info" class="col9 ml20">
<div class="fl">$browser_info ($device)</div>
<a href="javascript:void(0);" onclick="onojs_hide('test_browser_info');onojs_block('test_browser_more');"
class="button button_micro ml10">$BLK{'more_info'}</a>
</div>
<div id="test_browser_more" class="col9 ml20 hide">
$browser_info ($device), $ENV{'HTTP_USER_AGENT'}
</div>
</td>
</tr>
$MSIE_WARNING
</table>
</td>
</tr>
<tr>
<td></td>
<td class="p5"></td>
</tr>
<tr>
<td><img class="block32 mr5" src="$BASE/ono/osr/images/icons/crystal/32x32/ono/smiley_green.png" alt=""></td>
<td class="lightgreen bold">$txts[0]</td>
</tr>
<tr>
<td></td>
<td>
<table class="default_table">
<tr>
<td><img class="block24 mr5" src="$BASE/ono/osr/images/icons/crystal/32x32/$INFO{'ono_icon'}.png" alt=""></td>
<td class="lightgreen">$INFO{'ono_text'}</td>
</tr>
<tr>
<td></td>
<td><div class="col9 ml20">$ono_info</div></td>
</tr>
<tr>
<td><img id="morzino_test_js_img" class="block24 mr5" src="$BASE/ono/osr/images/icons/crystal/32x32/ono/smiley_red.png" alt=""></td>
<td class="lightred">
<div id="morzino_test_js_text" class="lh125">
$msgs[12]
$msgs[13]
</div>
</td>
</tr>
<tr>
<td></td>
<td><div id="morzino_test_js_version" class="col9 ml20">Unknown Morzino/ONOJS Version</div></td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<script>
onojs_setsrc('morzino_test_js_img','$BASE/ono/osr/images/icons/crystal/32x32/ono/smiley_green.png');
onojs_class('morzino_test_js_text','lightgreen lh125');
onojs_sethtml('morzino_test_js_text',"$msgs[14]");
onojs_version('morzino_test_js_version');
</script>
~;

if (ONO::IO->device("mac")) {

$WEB .= qq~<script>
if (navigator.maxTouchPoints > 1) {
onojs_sethtml('ono_os_info_add',' - $msgs[15]');
}
</script>
~;
}


###################################################################
# DEVSTATION
###################################################################

if (ONO::IO->devstation || $vars{'username'} eq "kirje257" || $vars{'username'} eq "jos") {

if (!$vars{'mode'}) {

my ($V1,$V2,$EXP);

my $UP_INFO = "# DO NOT EDIT THIS FILE, it is generated by the platform's test app.\n";
$UP_INFO .= "# Update it by first running /ono/sys/ONO.pl (command line), followed by opening the test app (web browser).\n\n";

my $V2_LIST = "# A list of configurable apps, using the new app framework (late 2018 or better).\n$UP_INFO";
my $APP_NAMES_INFO = "# A list of app names.\n$UP_INFO";

my @langs = ('en','de','lu','fr');
my %APP_NAMES;

foreach my $app (ONO::IO->ls("cgi-bin/local/perl/$community/apps")) {
if ($app !~ /^\./ && $app =~ /\.pl/) {

my $app_name = $app;
$app_name =~ s~\.(.*)$~~;
my $status = qq~<span class="lightred">V1 (2011)</span>~;
my ($size1,$size2,$is_v2,$uses_v2_module);

foreach my $line (ONO::IO->list("cgi-bin/local/perl/$community/apps/$app")) {
if ($line =~ /^use ONO::FW::Edu::Apps::Modules::(.*?);/) {
$is_v2++;
$uses_v2_module = $1;
my $lines = 0;
foreach my $codeline (ONO::IO->list("ono/sys/ONO/Ext/Morzino/Apps/Modules/$1.pm")) {
if ($codeline =~ /[A-Za-z0-9]/) {
$lines++;
}
}
$status = qq~<span class="lightgreen">V2 (2019)</span>~;
my $kb = ONO::IO->size("ono/sys/ONO/Ext/Morzino/Apps/Modules/$1.pm","k");

$size1 = qq~<span class="bold">$kb</span> kb~;
$size2 = qq~<span class="bold">$lines</span> lines~;
}
}

my ($CLASS,$GAME,$MODULE);
if ($app eq "_build\.pl") {
$CLASS = " bg_fabric";
$MODULE = " [ ONO::FW::Edu::Apps::Modules::$uses_v2_module ]";
} else {
if ($app =~ /^\_/) {
$CLASS = " trans30";
}
}
# if ($app =~ /^(breakout|chess|hangman|hanoi|minesweeper|pong|pool|snake|sudoku|tetris|tictactoe)\.pl$/) {
# $GAME = "   game: ";
# $CLASS = " trans30";
# }

my $LINE = qq~ <tr class="bt bb row$CLASS">
<td class="pad10_2 w50"><a href="/cgi-bin/local/perl/$community/apps/$app">$GAME$app</a>$MODULE</td>
<td class="pad10_2 w50 bold">$status</td>
<td class="pad10_2 tar">$size1</td>
<td class="pad10_2 tar">$size2</td>
</tr>
~;

if ($is_v2) {
$V2 .= $LINE;
if ($app_name !~ /^_/) {
my $SW = ONO::IO->load("ono/sys/ONO/Ext/Morzino/Apps/Switches/$app_name.txt");
$V2_LIST .= "app:${app_name}:$SW:\n";
}

} else {
if ($app =~ /^_/) {
$EXP .= $LINE;
} else {
$V1 .= $LINE;
}
}

foreach my $la (@langs) {
foreach my $line (sort ONO::IO->list("var/community/$community/apps/$app_name.txt")) {
my @lp = split(/:/,$line);
if (($lp[0] eq "title" && $la eq "en") || $lp[0] eq "title_$la") {
$APP_NAMES{$la} .= "${app_name}:$lp[1]:\n";
}
}
}

}
}

foreach my $la (@langs) {

ONO::IO->mkpath("var/community/$community/apps/names");
ONO::IO->store("var/community/$community/apps/names/$la.txt","$APP_NAMES_INFO$APP_NAMES{$la}");

}

ONO::IO->store("ono/sys/ONO/Ext/Morzino/Apps.txt",$V2_LIST);

$WEB .= qq~<table class="wide_table">
<tr class="vtop">
<td class="w60 p10">
<table class="wide_table bt bb">
$V2
</table>
</td>
<td class="w40 p10">
<table class="wide_table bt bb">
$V1
$EXP
</table>
</td>
</tr>
</table>
~;
}

###################################################################
# GENERATE VERB LIST
###################################################################

if ($vars{'mode'} eq "verbs_fr") {

$WEB .= qq~<div style="padding-left:100px">~;

my @verbs = ONO::IO->dir("ono-data/school/$vars{'mode'}/verbs");
foreach my $verb (@verbs) {
if ($verb =~ s~^verb_~~ && $verb =~ s~\.txt$~~) {

my @lines = ONO::IO->list("ono-data/school/$vars{'mode'}/verbs/verb_$verb.txt");
my %data;

foreach my $line (@lines) {

my @lp = split(/\^/,$line);
$data{$lp[0]} = $lp[1];

}

$WEB .= qq~<h1 class="col6">$verb</h1>
<div class="col9">
<table class="default_table mb20">
<tr class="vtop">
<td style="padding:10px"><span class="bold">participe</span><br>$data{'PART_PRES'}<br>$data{'PART_PASSE'}<br></td>
<td style="padding:10px"><span class="bold">ip</span><br>$data{'IP1'}<br>$data{'IP2'}<br>$data{'IP3'}<br>$data{'IP4'}<br>$data{'IP5'}<br>$data{'IP6'}<br></td>
<td style="padding:10px"><span class="bold">imp</span><br>$data{'IMP1'}<br>$data{'IMP2'}<br>$data{'IMP3'}<br>$data{'IMP4'}<br>$data{'IMP5'}<br>$data{'IMP6'}<br></td>
</tr>
<tr class="vtop">
<td style="padding:10px"><span class="bold">pc</span><br>$data{'PC1'}<br>$data{'PC2'}<br>$data{'PC3'}<br>$data{'PC4'}<br>$data{'PC5'}<br>$data{'PC6'}<br></td>
<td style="padding:10px"><span class="bold">fut</span><br>$data{'FUT1'}<br>$data{'FUT2'}<br>$data{'FUT3'}<br>$data{'FUT4'}<br>$data{'FUT5'}<br>$data{'FUT6'}<br></td>
<td style="padding:10px"><span class="bold">con</span><br>$data{'CON1'}<br>$data{'CON2'}<br>$data{'CON3'}<br>$data{'CON4'}<br>$data{'CON5'}<br>$data{'CON6'}<br></td>
</tr>
<tr class="vtop">
<td style="padding:10px"><span class="bold">pr</span><br>$data{'PR1'}<br>$data{'PR2'}<br>$data{'PR3'}<br>$data{'PR4'}<br>$data{'PR5'}<br>$data{'PR6'}<br></td>
<td style="padding:10px"><span class="bold">fp</span><br>$data{'FP1'}<br>$data{'FP2'}<br>$data{'FP3'}<br>$data{'FP4'}<br>$data{'FP5'}<br>$data{'FP6'}<br></td>
<td style="padding:10px"><span class="bold">subj</span><br>$data{'SUBJ1'}<br>$data{'SUBJ2'}<br>$data{'SUBJ3'}<br>$data{'SUBJ4'}<br>$data{'SUBJ5'}<br>$data{'SUBJ6'}<br></td>
</tr>
<tr class="vtop">
<td style="padding:10px"><span class="bold">impe</span><br>$data{'IMPE1'}<br>$data{'IMPE2'}<br>$data{'IMPE3'}<br>$data{'IMPE4'}<br>$data{'IMPE5'}<br>$data{'IMPE6'}<br></td>
<td style="padding:10px"><span class="bold">ps</span><br>$data{'PS1'}<br>$data{'PS2'}<br>$data{'PS3'}<br>$data{'PS4'}<br>$data{'PS5'}<br>$data{'PS6'}<br></td>
</tr>
</table>
</div>
~;
}
}

$WEB .= qq~</div>~;

}

###################################################################
# GENERATE VOCS
###################################################################

if ($vars{'mode'} eq "vocs") {

$WEB .= qq~<div style="padding-left:100px">~;

my @vocs = ONO::IO->dir("ono-data/school/vocs");
foreach my $voc (@vocs) {
if ($voc =~ m~^lessons_~) {

$WEB .= qq~<h1 class="col3">$voc</h1>~;

my @files = ONO::IO->dir("ono-data/school/vocs/$voc/basic");
foreach my $file (@files) {
if ($file =~ m~\.txt$~) {

$WEB .= qq~<h2 class="col6">$file</h2>
<div class="col9">
<table class="default_table mb20">~;

my @lines = ONO::IO->list("ono-data/school/vocs/$voc/basic/$file");
foreach my $line (@lines) {

$line =~ s~(\;|\=)~</td><td>~g;
$WEB .= qq~ <tr><td>$line</td></tr>~;

}

$WEB .= qq~ </table>
</div>
~;

}
}

}
}

$WEB .= qq~</div>~;

}
}

###################################################################
# DONE
###################################################################

$WEB .= ONO::IO->devstation_refresh();

# $WEB = ONO::FW::Edu::Apps::ToolBox->apps_gate($WEB,$vars_ref);

return $WEB;

}

###################################################################
#### THAT'S IT :-D
###################################################################

1;

__END__