:- use_module( library(lib) ).
:- lib(real).
:- lib(mtx).
:- lib(debug_call).

:- r_library( "RSQLite" ).

:- lib( mtx_df/2 ).
:- lib( read_terms/2 ).

:- set_prolog_stack(global, limit(2*10**9)). % for edge_string_hs.pl

:- debug( r_sql ).

/** r_terms_sqlite( +File ).

Load a csv or prolog facts data from a file to the corresponding .sqlite file.

?- cd( '/usr/local/users/nicos/work/bio_db/dnloads/go/maps' ).
?- cd( '/tmp/map' ).

?- r_terms_sqlite( 'map_gont_symb_gont.pl', Load ).

*/
testo :- % THIS IS THE BEST WAY
	cd( '/tmp/map/' ),
	% PlF = 'map_gont_gont_gonm.pl',
	PlF = 'map_gont_gont_symb.pl',
	r_terms_sqlite( PLF ).

r_terms_sqlite( PLF ) :-
	read_terms( PlF, Facts ),
	file_name_extension( Stem, _Ext, PlF ),
	file_name_extension( Stem, csv, CsvF ),
	mtx( CsvF, [row(go_term,go_name)|Facts] ),
	file_name_extension( Stem, sqlite, SqliteF ),
	r_sql <- read.csv( +CsvF ),
	rs_con <- dbConnect('SQLite()', dbname = +SqliteF ),
	Facts = [Fact|_],
	functor( Fact, Pname, _Arity ),
	r_sql <- as.data.frame(r_sql),
	<- dbWriteTable(rs_con, +Pname, r_sql),
	<- dbDisconnect(rs_con),
	delete_file( CsvF ).
	
/*
	
testo1 :-
	% cd( '/usr/local/users/nicos/work/bio_db/dnloads/go/maps' ),
	cd( '/tmp/map/' ),
	% r_terms_sqlite( 'map_gont_symb_gont.pl' ).
	% r_terms_sqlite( 'edge_string_hs_symb.pl' ).
	% r_terms_sqlite( 'edge_string_hs.pl' ).
	r_terms_sqlite( 'map_gont_gont_gonm.pl' ).
	% r_sqlite_load( 'map_gont_gont_symb.pl' ).
	
r_terms_sqlite( File ) :-
	file_name_extension( Stem, Ext, File ),
	file_name_extension( Stem, sqlite, SqliteF ),
	r_ext_sqlite_load( Ext, File, SqliteF ).

r_ext_sqlite_load( csv, CsvF, SqliteF ) :-
	fixme( CsvF, SqliteF ).
r_ext_sqlite_load( pl, PlF, SqliteF ) :-
	% mtx( MtxF, Rows ),
	read_terms( PlF, Facts ),
	% mtx_df( Facts, r_sql ),
	% length( Facts, Len ),
	mtx_df_vectors( Facts, r_sql ),

	% <- r_sql,

	debug_call( r_sql, length, rows/Facts ),
	debug_call( r_sql, wrote, SqliteF ),

	Facts = [First|_], 
	functor( First, Pname, _ ),
	rs_con <- dbConnect('SQLite()', dbname=+SqliteF),
	<- dbWriteTable(rs_con, +Pname, r_sql),
	<- dbDisconnect(rs_con),
	debug( r_sql, 'done', false ),
	true.

mtx_df_vectors( Facts, Df ) :-
	Facts=[First|_],
	functor( First, _, Arity ),
	mtx_df_args( Arity, Facts, Vects ),
	DfCall =.. ['data.frame'|Vects],
	Df <- DfCall.

mtx_df_args( 0, _Facts, Pairs ) :-
	!,
	Pairs = [].
mtx_df_args( I, Facts, [Arg|Tairs] ) :-
	atom_concat( arg, I, Arg ),
	maplist( arg(I), Facts, Iths ),
	Arg <- Iths,
	H is I - 1,
	mtx_df_args( H, Facts, Tairs ).

*/