#!/usr/bin/perl
#use strict;
#use warnings;
#use feature "say";

use Gtk3::WebKit2;
use Gtk3::JavaScriptCore;
use JSON qw(encode_json);
use Gtk3 qw( -init );

use Cwd qw( abs_path );
use File::Basename;

use Data::Dumper;

my $script_path = __FILE__;
print "A script elérési útvonala: $script_path\n";

my $script_abs_path = abs_path(__FILE__);
print "Az abszolút elérési út: $script_abs_path\n";

my $script_abs_dir = dirname($script_abs_path);
print "Script mappa: $script_abs_dir\n";

#$view->load_html(HTML, 'file:///');
sub run_javascript {
    my ($view, $javascript_string) = @_;

    my $done = 0;

    $view->run_javascript	(
    							$javascript_string,
    							undef,
    							sub	{
    									my ($object, $result, $user_data) = @_;
        								$done = 15;
        								return get_json_from_javascript_result($view, $result);
        								#return $result;
    								},
    							undef
    						);

    Gtk3::main_iteration while Gtk3::events_pending and not $done;
}

sub get_json_from_javascript_result {
    my ($view, $result) = @_;

    my $value = $view->run_javascript_finish($result);
    my $js_value = $value->get_js_value;
    print "jsVlaue is string? = ";
    print $js_value->is_string."\n";

    print "js value: "; print $js_value->to_string ; print "\n";

    #my $json = encode_json $js_value->to_string;

    return $json;
}

################################CALL BACK JS SCRIPT...
sub Call {
    my ($manager, $js_result) = @_;
	my $js_value = $js_result->get_js_value();

    print "js value: "; print $js_value->to_string ; print "\n";
}


sub myGtkBuilder
{
	my $uiFileName = shift ;
	if(!$uiFileName)
	{
		die "ERROR: No ui filename, EXIT!";
	}

	my $gtkHashRef = NULL ;

	#2. paraméter beolvasása (ha van)
	my $inputParameter = shift;

	#A 2. paraméter HASH ?
	if(ref($inputParameter)=~/^H/)
	{
		#Ha HASH akkor az a "gtkHashRef" paraméter, majd beolvassni a következő paramétert (ha van) mert a jelenlegit feldolgoztuk...
		$gtkHashRef=$inputParameter;
		$inputParameter = shift;
		print "\nHASH!\n";
	}
	else
	{
		#Ha nem HASH akkor létrehozni egy üres névtelen HASH-t, ilyenkor megmarad az "inputParameter"
		$gtkHashRef= {} ;
		print "\nNO HASH!\n";
	}

	#A 2. (vagy a 3. ha 2. HASH-volt) paraméter ARRAY ?
	if(ref($inputParameter)=~/^A/)
	{
		#Ha ARRAY akkor végigjárni és tömb elemeit és új kulcsként NULL értékkel felvenni a "gtkHashRef" HASH-be.
		foreach (@$inputParameter)
		{
			$$gtkHashRef{$_}=NULL;
		}
		print "\nARRAY!\n";
	}
	else
	{
		#Ha nem ARRAY akkor a jelenlegi "inputParameter"-t  ÉS!!! az összes esetleges ezutáni paramétert is kulcsként NULL értékkel felvenni a "gtkHashRef" HASH-be.
		$$gtkHashRef{$inputParameter}=NULL;
		foreach $inputParameter (@_)
		{
			$$gtkHashRef{$inputParameter}=NULL;
		}
		print "\nNO ARRAY!\n";
	}

	my $BUILDER;

	$BUILDER =Gtk3::Builder->new();
	$BUILDER->add_from_file($uiFileName);
	$BUILDER->connect_signals(undef);

	foreach my $GTK_ELEMNETS ( keys (%$gtkHashRef) )
	{
		$$gtkHashRef{$GTK_ELEMNETS}= $BUILDER->get_object($GTK_ELEMNETS);
	}

	print "builder\n";
}

############


######################################################################################MAIN!!!!

use constant PI    => 4 * atan2(1, 1);
use lib '.';

my @uriList = ( "file://$script_abs_dir/main.html" );

print "URI LOAD" . $uriList[0] . "\n";

my %GTK;

&myGtkBuilder	(
					"WebUI.ui",
					\%GTK,
					#[
						"MainWindow"	,
						"edit"			,
						"webkit"		,
						"label"			,
						"jsEdit"		,
					#]
				);

%GTK{"MainWindow"}->show_all;

my $user_content_manager = $GTK{"webkit"}->get_user_content_manager();
$user_content_manager->signal_connect('script-message-received::Call' => \&Call, undef);
$user_content_manager->register_script_message_handler('Call');

$GTK{"webkit"}->load_uri( $uriList[0] );

#print Data::Dumper->Dump($GTK{"webkit"});
print "myDUMP: ".$GTK{"webkit"}." \n";
my $HASH = $GTK{"webkit"} ;
foreach (keys (%$HASH) )
{
	print "\t$_";
}
print "END!\n\n";

Gtk3::main;

####################################################################################CALL

########Open Window Callback

sub on_jsRun_clicked
{
	#print $GTK{"webkit"}->run_javascript($GTK{"jsEdit"}->get_text());
	&run_javascript($GTK{"webkit"}, $GTK{"jsEdit"}->get_text() );

	#$GTK{"webkit"}->run_javascript($GTK{"jsEdit"}->get_text());

	print "CLICKED jsRUN! -> ".$GTK{"jsEdit"}->get_text()."\n";
}

sub on_jumpButton_clicked
{
	$GTK{"webkit"}->load_uri($GTK{"edit"}->get_text());
}

sub on_homeButton_clicked
{
	$GTK{"webkit"}->load_uri( $uriList[0] );
}

sub on_refreshButton_clicked
{
	$GTK{"webkit"}->load_uri( $uriList[ $#uriList ] );
}

sub on_rewindButton_clicked
{
	if($#uriList>0)
	{
		pop(@uriList);
		$GTK{"webkit"}->load_uri( $uriList[ $#uriList ] );
	}
	else
	{
		$GTK{"webkit"}->load_uri( $uriList[0] );
	}
}

sub on_webkit_load_changed
{
	my $curUri = $GTK{"webkit"}->get_uri() ;
	if( $uriList[$#uriList] ne $curUri )
	{
		push(@uriList,$curUri);
	}
	$GTK{"label"}->set_label( " LIST: ".$#uriList." STATE: "."OK"." URI: ".$curUri );

	print "LOAD CHANGE!!! ".scalar(localtime)."\n"

}

sub on_webkit_submit_form
{
	print "on_webkit_submit_form!!! ".scalar(localtime)."\n"
}


sub on_webkit_user_message_received
{
	print "on_webkit_user_message_received!!! ".scalar(localtime)."\n"
}

sub exit
{
    Gtk3::main_quit;
}

__END__
