#!/usr/bin/perl

use strict;	# buenas prácticas de programación
use warnings;	# muestra advertencias si es necesario

use Config;
BEGIN {
	$Config{useithreads} or die "Para usar este programa se necesita \"ithreads\" recompila Perl para ejecutar este programa";
}

use Glib qw/TRUE FALSE/; 	# llama a utilizar glib con las palabras verdadero / falso
use Gtk2 '-init';		# inicializa gtk2


&_main;				# llama a la subrutina principal

Gtk2 -> main; 			# Ejecuta GTK 


sub _main() {
	# VENTANA PRINCIPAL
	my ($v_principal); #variable de la ventana principal
	&_inicializar_gui('ventana_principal', \$v_principal, 'PI - Verificador de tarjetas Ford C489', 1050, 550); # envía la llamada para inicializar la ventana principal
	
	# CONTENEDOR VERTICAL
	my ($vb); #variable global vbox (contenedor vertical)
	&_inicializar_gui('vbox', \$vb);	# Inicializa contenedor vertical
	
	# CONTENEDORES HORIZONTALES
	my ($hb01, $hb02, $hb03); 	#variables globales de contenedores horizontales
	my @hbs = (
		\$hb01,
		\$hb02,
		\$hb03,
	);
	&_inicializar_gui('hbox', \@hbs);	# Inicializa contenedores horizontales

	# ETIQUETAS
	my ($e_modelo, $e_cantidad) = ('Modelo:   ', 'Cantidad:   ');	# variables globales de las etiquetas
	my @es = (\$e_modelo, \$e_cantidad,);
	
	&_inicializar_gui('etiqueta',\@es);	# Inicializa las etiquetas

	# ENTRADAS DE TEXTO
	my ($et_modelo, $et_cantidad) = (50, 3); 		# variables cajas de texto introducir datos a verificar
		my @entradas_texto = (\$et_modelo, \$et_cantidad);
		&_inicializar_gui('entrada_texto', \@entradas_texto);		# inicializa las entradas de texto
	
	
	# VISTA DE TEXTO 
	# datos de scroll de las entradas
	my ($cuadro_texto, $ventana_enrollable, $vista_texto);		#variables para la vista de texto
	&_inicializar_gui('vista_texto', \$cuadro_texto, \$ventana_enrollable, \$vista_texto, 5, 500, 400, 'automatic', 'automatic', "TRUE"); # (funcion, ref_cuadro_texto, ref_ventana_enrollable, ref_vista_texto, borde, tam_horiz, tam_vert, modo_horiz, modo_vert, editable)
	# formar la ventana
	$ventana_enrollable -> add($vista_texto); 	# agrega la vista de texto a la ventana enrollable
	$cuadro_texto -> add($ventana_enrollable);	# agrega la ventana enrollable
	
	
	# BOTONES
	my ($b_iniciar, $b_salir) = ('Iniciar', 'Salir');	# Variables globales de los botones
	my @bs = (
		\$b_iniciar,
		\$b_salir,
	);
	&_inicializar_gui('boton', \@bs);	# Inicializa los botones 
		$b_salir -> signal_connect('clicked' => \&_sale_programa);
		
		my @parametros_boton_iniciar = (\$b_iniciar, \$et_modelo, \$et_cantidad, \$vista_texto);
		$b_iniciar -> signal_connect('clicked' => \&_inicia_programa, \@parametros_boton_iniciar);
	
	
	# VISTA IMAGEN PCB
	my $imagen_pcb = Gtk2::Image -> new();
		my $pixbuf_pcb = Gtk2::Gdk::Pixbuf -> new_from_file('imagen_inicial_escaneo_PCBs.jpg');
		$pixbuf_pcb = $pixbuf_pcb -> scale_simple(550, 300, "nearest");
		$imagen_pcb -> set_from_pixbuf($pixbuf_pcb);

	
	# VISTA IMAGEN PASA/FALLA
	#my $imagen_pf = Gtk2::Image -> new();
	#	my $pixbuf_pf = Gtk2::Gdk::Pixbuf -> new_from_file('imagen_inicial_pasa_falla.jpg');
	#	$pixbuf_pf = $pixbuf_pf -> scale_simple(250, 400, "nearest");
	#	$imagen_pf -> set_from_pixbuf($pixbuf_pf);
		
	# AGREGA LOS WIDGETS
	# Agrega el contenedor vertical a la ventana principal
	$v_principal -> add($vb);
	# Agrega los contenedores horizontales al vertical
	$vb -> pack_start($hb01, FALSE, FALSE, 3);
	$vb -> pack_start(Gtk2::VSeparator -> new, FALSE, FALSE, 3);
	$vb -> pack_start($hb02, FALSE, FALSE, 3);
	$vb -> pack_start(Gtk2::VSeparator -> new, FALSE, FALSE, 3);
	$vb -> pack_start($hb03, TRUE, FALSE, 3);
	# agrega los botones al contenedor hb01
	$hb01 -> pack_start($b_iniciar, TRUE, TRUE, 3);
	$hb01 -> pack_start(Gtk2::HSeparator -> new, FALSE, FALSE, 3);
	$hb01 -> pack_start($b_salir, TRUE, TRUE, 3);
	# agrega las etiquetas a sus contenedores
	$hb02 -> pack_start($e_modelo, TRUE, FALSE, 3);
	$hb02 -> pack_start($et_modelo, TRUE, TRUE, 3);
	$hb02 -> pack_start(Gtk2::HSeparator -> new, FALSE, FALSE, 3);
	$hb02 -> pack_start($e_cantidad, TRUE, FALSE, 3);
	$hb02 -> pack_start($et_cantidad, TRUE, TRUE, 3);
	# agrega la ventana de texto, imagen de la PCB, imágen passa/falla
	$hb03 -> pack_start($cuadro_texto, FALSE, FALSE, 3);
	$hb03 -> pack_start(Gtk2::HSeparator -> new, FALSE, FALSE, 3);
	$hb03 -> pack_start($imagen_pcb, FALSE, TRUE, 3);
	#$hb03 -> pack_start(Gtk2::HSeparator -> new, FALSE, FALSE, 3);
	#$hb03 -> pack_start($imagen_pf, FALSE, TRUE, 3);
	
	$v_principal-> show_all();
}


sub _inicializar_gui() {
	my $caso = shift(@_);
	
	use feature "switch";
	given($caso) {
		
		when ('ventana_principal') {
			my $rv_ventana = shift(@_);				# toma el valor pasado de la referencia de la ventana_principal
			my $titulo_ventana = shift(@_);				# toma el valor para asignar el título
			my $ancho_ventana = shift(@_);				# valor del ancho de la ventana
			my $alto_ventana = shift(@_);				# valor del alto de la ventana
			$$rv_ventana = Gtk2::Window -> new('toplevel');		# tipo de ventana de nivel superior (master)
			$$rv_ventana -> set_title("$titulo_ventana");	# título de la ventana
			$$rv_ventana -> set_border_width (10);			# ancho de borde
			$$rv_ventana -> set_default_size ("$ancho_ventana", "$alto_ventana");			# tamaño inicial de la ventana
			$$rv_ventana -> set_position('center_always');			# centra siempre la ventana al aparecer
			$$rv_ventana -> signal_connect (delete_event => \&_sale_programa);	# al cerrar la ventana corre la subrutina de finalización
		}
		when ('ventana_emergente') {
			my $rv_ventana = shift(@_);				# toma el valor pasado de la referencia de la ventana_principal
			my $titulo_ventana = shift(@_);				# toma el valor para asignar el título
			my $ancho_ventana = shift(@_);				# valor del ancho de la ventana
			my $alto_ventana = shift(@_);				# valor del alto de la ventana
			$$rv_ventana = Gtk2::Window -> new();			# tipo de ventana de nivel superior (master)
			$$rv_ventana -> set_title("$titulo_ventana");		# título de la ventana
			$$rv_ventana -> set_border_width (10);			# ancho de borde
			$$rv_ventana -> set_default_size ("$ancho_ventana", "$alto_ventana");		# tamaño inicial de la ventana
			$$rv_ventana -> set_position('center_always');		# centra siempre la ventana al aparecer
			#$$rv_ventana -> signal_connect (delete_event => \&_sale_programa);	# al cerrar la ventana corre la subrutina de finalización
		}
		when ('vbox') {
			my $rv_vbox = shift(@_); 	# toma el valor de la referencia de la variable del contenedor vertical
			$$rv_vbox = Gtk2::VBox -> new (FALSE, 0); 	# convierte la variable en un contenedor vertical
		}
		
		when ('hbox') {
			my $rm_lista_hbox = shift(@_);		# toma el valor de la matriz de lista de las cajas horizontales
			foreach my $rv_hbox(@$rm_lista_hbox) {
				$$rv_hbox = Gtk2::HBox -> new (FALSE, 0);	# convierte la variable en un contenedor horizontal
			}
		}
		when ('menus') {
			my $rv_menu = shift(@_);		# toma el valor de la referencia de la variable del menu
				$$rv_menu = Gtk2::Menu->new();	# crea el menu
				$$rv_menu -> append(Gtk2::TearoffMenuItem->new);		# agrega un separador
			my $menu_item_iniciar = Gtk2::ImageMenuItem->new ('~Empezar', undef);	# Crea el menú de acción
				$menu_item_iniciar -> signal_connect('activate' => sub { print "selected the cut menu\n"});
			$$rv_menu -> append($menu_item_iniciar);
		}
		when ('boton') {
			my $rm_boton = shift(@_);		# toma el valor de la referencia de la variable del boton
			foreach my $rv_boton(@$rm_boton) {
				my $texto = $$rv_boton;
				$$rv_boton = Gtk2::Button -> new_with_mnemonic("$texto");	# crea el boton con la etiqueta
			}
		}
		when ('boton_stock') {
			my $rm_lista_botones = shift(@_);
				foreach my $rv_boton(@$rm_lista_botones) {
					my $tipo_boton = $$rv_boton;						# toma el tipo de boton a crear
					$$rv_boton = Gtk2::Button -> new_from_stock("$tipo_boton"); 		# crea el botón con el tipo de stock
				}
		}
		when ('etiqueta') {
				my $rm_etiqueta = shift(@_);
			foreach my $rv_etiqueta(@$rm_etiqueta) {
				my ($color_texto, $color_fondo, $tam_letra) = ("#001188", "#000000", "16");
				my $texto = $$rv_etiqueta;
				$$rv_etiqueta = Gtk2::Label -> new();
				$$rv_etiqueta -> set_markup("<span fgcolor=\'$color_texto\'  font=\'$tam_letra\'><b>$texto</b></span>");
				}
		}
		when ('vista_texto') {
			my $rv_cuadro_texto = shift(@_); 	#print "$rv_cuadro_texto\n";
			my $rv_ventana_enrollable = shift(@_);	#print "$rv_ventana_enrollable\n";
			my $rv_vista_texto = shift(@_);		#print "$rv_vista_texto\n";
			my $ancho_borde = shift(@_);		#print "$ancho_borde\n";
			my $ancho_ventana = shift(@_);		#print "$ancho_ventana\n";
			my $alto_ventana = shift(@_);		#print "$alto_ventana\n";
			my $modo_horiz = shift(@_);		#print "$modo_horiz\n";
			my $modo_vert = shift(@_);		#print "$modo_vert\n";
			my $editable = shift(@_);		#print "$editable\n";
				$$rv_cuadro_texto = Gtk2::Frame -> new();				# Crea el cuadro a contener la ventana enrollable (scroll window)
					$$rv_cuadro_texto -> set_border_width("$ancho_borde");		# coloca el borde a la ventana
					$$rv_cuadro_texto -> set_size_request("$ancho_ventana","$alto_ventana");	# ancho y alto de la ventana
				$$rv_ventana_enrollable = Gtk2::ScrolledWindow -> new();		# crea la ventana enrollable a contener la ventana de texto
					$$rv_ventana_enrollable -> set_policy("$modo_horiz", "$modo_vert");		# modo de desplazamiento de la ventana
				$$rv_vista_texto = Gtk2::TextView -> new();				# crea la ventana de texto que mostrará lo escaneado
					$$rv_vista_texto -> set_editable ("$editable");			# la ventana de texto será editable
		}
		when('entrada_texto') {
			my $rm_lista_entrada_texto = shift(@_);						# toma el valor de la referencia de la matriz con la lista de las entradas de texto
			foreach my $rv_entrada_texto(@$rm_lista_entrada_texto) {
				my $long_caracteres = $$rv_entrada_texto;				# máximo de caracteres permitidos
				$$rv_entrada_texto = Gtk2::Entry -> new_with_max_length("$long_caracteres");
			}
		}
	}
	
}

sub _inicia_programa() {
	# obtener parametros 
	my $rm_parametros = ($_[1]);			# parámetros recibidos en la matriz
	my $rv_boton_iniciar = shift(@$rm_parametros);
	my $rv_et_modelo = shift(@$rm_parametros);
	my $rv_et_cantidad = shift(@$rm_parametros);
	my $rv_vista_texto = shift(@$rm_parametros);
	
	# convertir en insensible el botón iniciar
	$$rv_boton_iniciar -> sensitive(FALSE);
		
	# obtener los valores de las etiquetas
	my $modelo = $$rv_et_modelo -> get_text; 	print "modelo:   $modelo\n";
	my $cantidad = $$rv_et_cantidad -> get_text;	print "cantidad: $cantidad \n";
}



sub _inicia_programa_antiguo() {
	my $rm_parametros = ($_[1]);
	my $rv_boton = shift(@$rm_parametros);		# el primer dato equivale al procedente de la llamada a la subrutina, en este caso "Gtk2::Button", utilizar siempre el segundo parámetro de la variable por defecto para razón de transferir la(s) referencia(s) necesarias.
	my $rv_e_modelo = shift(@$rm_parametros);
	my $rv_e_cantidad = shift(@$rm_parametros);
	
	$$rv_boton -> set_label ('Corriendo');
	$$rv_boton -> sensitive(FALSE);
	
	# VENTANA EMERGENTE
	my ($ventana_modelo_cantidad);			# ventana emergente para preguntar modelo y cantidad
		&_inicializar_gui('ventana_emergente', \$ventana_modelo_cantidad, 'Introduce la Cantidad y el Modelo', 800, 250); 	# inicializa la ventana emergente
	
	# ETIQUETAS
	my ($e_cantidad_i, $e_modelo_i) = ('Introduce la cantidad:', 'Introduce el modelo:  '); 		# etiquetas de la ventana
		my @lista_etiquetas = (\$e_cantidad_i, \$e_modelo_i);
		&_inicializar_gui('etiqueta', \@lista_etiquetas);					# inicializa las etiquetas

	# ENTRADA DE TEXTO
	my ($t_cantidad_i, $t_modelo_i) = (10, 10); 		# (long_caracteres, long_caracteres)	# entradas de texto a la ventana
		my @lista_entrada_texto = (\$t_cantidad_i, \$t_modelo_i);
		&_inicializar_gui('entrada_texto', \@lista_entrada_texto);				# inicializa las entradas de texto
	
	# BOTON usando stock buttons
	my ($b_aceptar, $b_cancelar) = ('gtk-ok', 'gtk-cancel');				# creacion de los botones
		my @botones_stock = (\$b_aceptar, \$b_cancelar);				# lista de botones stock
		&_inicializar_gui ('boton_stock', \@botones_stock);				# inicializa los botones
		
		$b_aceptar -> signal_connect('clicked', sub{
								my $texto_cantidad = $t_cantidad_i -> get_text;
								my $texto_modelo = $t_modelo_i -> get_text;
								$$rv_e_modelo -> set_label("$texto_modelo");
								$$rv_e_cantidad -> set_label("$texto_cantidad");
							});	# funcion del boton

							$b_cancelar -> signal_connect('clicked' ,sub{
								$$rv_boton -> sensitive (TRUE);
								$$rv_boton -> set_label ('Iniciar');
								$ventana_modelo_cantidad -> destroy
							});	# funcion del boton
		
	# CONTENEDORES
	my ($vb_m_c);											# contenedor vertical
		&_inicializar_gui('vbox', \$vb_m_c);
	my ($hb_m_c_01, $hb_m_c_02, $hb_m_c_03);
		my @lista_hb = (\$hb_m_c_01, \$hb_m_c_02, \$hb_m_c_03);
		&_inicializar_gui('hbox', \@lista_hb);
	
	# EMPAQUETADO DE WIDGETS
	$ventana_modelo_cantidad -> add($vb_m_c);				# agrega el contenedor vertical a la ventana_modelo_cantidad
	$vb_m_c -> pack_start($hb_m_c_01, TRUE, FALSE, 3);			# empaca el primer contenedor horizontal
	$vb_m_c -> pack_start(Gtk2::VSeparator -> new, FALSE, FALSE, 3);	# separador
	$vb_m_c -> pack_start($hb_m_c_02, TRUE, FALSE, 3);			# empaca el segundo contenedor horizontal
	$vb_m_c -> pack_start(Gtk2::VSeparator -> new, FALSE, FALSE, 3);
	$vb_m_c -> pack_start($hb_m_c_03, TRUE, FALSE, 3);
	$hb_m_c_01 -> pack_start($e_modelo_i, FALSE, FALSE, 3);
	$hb_m_c_01 -> pack_start(Gtk2::HSeparator -> new, FALSE, FALSE, 3);
	$hb_m_c_01 -> pack_start($t_modelo_i, TRUE, TRUE, 3);
	$hb_m_c_02 -> pack_start($e_cantidad_i, FALSE, FALSE, 3);
	$hb_m_c_02 -> pack_start(Gtk2::HSeparator -> new, FALSE, FALSE, 3);
	$hb_m_c_02 -> pack_start($t_cantidad_i, TRUE, TRUE, 3);
	$hb_m_c_03 -> pack_start($b_aceptar, FALSE, FALSE, 3);
	$hb_m_c_03 -> pack_start(Gtk2::HSeparator -> new, FALSE, FALSE, 3);
	$hb_m_c_03 -> pack_start($b_cancelar, FALSE, FALSE, 3);
	$ventana_modelo_cantidad -> show_all;
}

sub _cambia_etiquetas() {

}

sub _sale_programa() {
	Gtk2->main_quit;	# sale del programa
	TRUE;
}
