package com.jobst_software.markdown2any;



import com.jobst_software.gjc2sx.Initable;
import com.jobst_software.gjc2sx.Disposable;
import com.jobst_software.gjc2sx.HasROClientProperties;

import com.jobst_software.gjc2sx.helpers.Ut;

import com.jobst_software.js.db.JsDatabase;
import com.jobst_software.js.helpers.JsUtil;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;



public class  MarkdownSqlSource   implements Initable, Disposable {

		public static class SqlRow   implements HasROClientProperties {
			protected 		ResultSet  rset;
			public  SqlRow( ResultSet  rset) {
				this.rset            = rset;
			}
			
			@Override
			public Object getClientProperty( Object key) {
				try {
					return  rset.getObject(     (String)key);
				}
				catch( Exception exc) {
					throw new  RuntimeException( exc);
				}
			}
		}
	
		
		
		
	// refs
	//
	protected MarkdownDocument 	doc;
	protected String[] 			main_args;
	
	// mems
	//
	protected JsDatabase 		 db;
	
	
public  MarkdownSqlSource( MarkdownDocument doc, String[] main_args)   throws Exception
{
	this.doc 	   = doc;
	this.main_args = main_args;
	
	db = JsUtil.getDefaultDatabase();
}

@Override
public void init()   throws Exception {
	String  									   sql = getIssuesSql();
	ResultSet    			 rset  = executeQuery( sql, null);
	while( 	     		     rset.next() ) {
		Vector<String>  headers = new Vector<String>(); 
		adjustHeaders(  headers, rset.getObject( AbstractMarkdownReader.PROJECT_ID));
		
		Object  		  tracker_id   = rset.getObject( AbstractMarkdownReader.TRACKER_ID);
		String  		  tracker_name = lookup("name", "select name from " + getTablename( AbstractMarkdownReader.TRACKERS_TAB_NO) + " where id = ?", tracker_id);
		doc.add( headers, tracker_name, new SqlRow( rset));
	}
	
	rset.close();
	rset = null;
}



@Override
public void  dispose()   throws Exception {
	db.destroy();
	db = null;
	
	doc = null;
}



protected ResultSet  executeQuery( 							 String sql, Object id)   throws Exception {
	PreparedStatement  stmt = db.getConnection().prepareStatement(	sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
	
	if( 				   id != null ) {
		stmt.setObject( 1, id);
	}
	
	return  stmt.executeQuery();
}


protected String  lookup( String fdName, String sql, Object id)   throws Exception {
	String     res          = null;
	ResultSet  rset = executeQuery( sql, id);
	if( 	   rset.next() ) { 
		res = rset.getString( fdName);
	}
	
	rset.close();
	rset = null;
	
	return  res;
}



public String  getTablename( int main_arg_table_no) {
  String[]  		 tabnames = Ut.scanArray( main_args[ AbstractMarkdownReader.PROJECTS_TRACKERS_ISSUES_ARG_NO + 1], ",", true);
  return  Ut.encode( tabnames[   main_arg_table_no], null).replace("\u0020", ".");
}




public String  getIssuesSql() {
	String  issues_where = main_args[ AbstractMarkdownReader.ISSUES_WHERE_ARG_NO + 1];
	
	return    "SELECT " + Ut.formatArray( MarkdownDocument.MarkdownIssue.FD_NAMES, ",") + ","
			+ "       "	+ AbstractMarkdownReader.PROJECT_ID + "," + AbstractMarkdownReader.TRACKER_ID
			+ " FROM  	  " + getTablename(AbstractMarkdownReader.ISSUES_TAB_NO) 
			+ " WHERE " + issues_where;																// z.B. tracker_id in (38,39,40,41) and status_id = 51  and  project_id <> 12 /* IT */ "
}



public String  getProjectsSql() {
	return    "select " + AbstractMarkdownReader.NAME + "," + AbstractMarkdownReader.PARENT_ID 
			+ " FROM " + getTablename(AbstractMarkdownReader.PROJECTS_TAB_NO) + " WHERE id = ?";
}



protected void  adjustHeaders( Vector<String> headers, Object project_id)   throws Exception {
	if( project_id != null ) {
		String 									project_sql = getProjectsSql();
		ResultSet  project_rset = executeQuery( project_sql, project_id);
		if( 	   project_rset.next() ) { 
			headers.add(   0,		  project_rset.getString( AbstractMarkdownReader.NAME));
			adjustHeaders( headers,   project_rset.getObject( AbstractMarkdownReader.PARENT_ID));
		}
		
		project_rset.close();
		project_rset = null;
	}
}


public String  getAttachmentsSql() {
	return  "select id, disk_directory, disk_filename FROM " + getTablename(AbstractMarkdownReader.ATTACHMENTS_TAB_NO) + " WHERE id = ?";
}


/**
 * /attachments/download/49
 *  [0]         [1]      [2]
 */
public String  adjustImgHref( 									     	       String imgHref)   throws Exception {
	if( 																	          imgHref != null  &&  !"".equals(imgHref) ) {
		String[]  					          attachments_download_id = Ut.scanArray( imgHref, "/", true);
		String         attachment_id_asText = attachments_download_id[ attachments_download_id.length - 1];
		if( !"".equals(attachment_id_asText) ) {
			String          resource_path = main_args[ AbstractMarkdownReader.RESOURCE_PATH_ARG_NO + 1];
			if( !"-".equals(resource_path) ) {
				String 							sql = getAttachmentsSql();
				ResultSet  rset = executeQuery( sql, attachment_id_asText);
				if( 	   rset.next() ) {
					imgHref = concat( concat( resource_path, rset.getString("disk_directory"), System.getProperty("file.separator")), 
									  					     rset.getString("disk_filename"),  System.getProperty("file.separator"));
				}
				
				rset.close();
				rset = null;
			}
		}
	}
	return  imgHref;
}


public String  adjustLinkHref( String linkHref)   throws Exception {
	String  		resource_url = main_args[ AbstractMarkdownReader.RESOURCE_URL_ARG_NO + 1];
	if( !"-".equals(resource_url) ) {
		linkHref =    concat( resource_url, linkHref, "/"); 
	}
	return  linkHref;
}


public String  concat( String t1, String t2, String del) {
	return    ""
			+ t1
			+ ( !Ut.makeString(t1).endsWith(del)  &&  !Ut.makeString(t2).startsWith(del) ?  del : "" )
			+ t2;
}



}
