/*
 * PANORAMICA :
 *
 * Tweet_Search e' un plugin della suite Query_Repo, serve ad interrogare
 * i repository online dei maggiori social network in particolare Twitter.
 * Si presenta con una semplice interfaccia grafica dove e' possibile effettuare
 * ricerche per parole chiave. La ricerca genera un file denominato logTweetSearch.txt
 * con all'interno i risultati che ha prodotto la ricerca ed inoltre genera uno
 * stack con scrollbar dove vengono visualizzate tutte le immagini relative alla ricerca.
 *
 *
 * PRE REQUISITI :
 *
 * Per poter utilizzare questo plugin e' necessario munirsi di chiavi di accesso reperibili all'indirizzo : https://dev.twitter.com/
 * nella sezione relativa all'applicazione.
 *
 *  N.B.: Se non avete creata un'app fittizia creatala, e' necessaria per ottenere le chiavi di accesso
 *
 * Copiare le varie chiavi e incollarle all'interno del frame che comparira' all'esecuzione del plugin
 *
 * 
 *
 *
 *
 * INSTALLAZIONE :
 *
 * Per installare questo plugin bisogna importare le librerie twitter4j disponibili
 * all'indirizzo http://twitter4j.org/en/index.html#download una volta scaricato l'archivio estraete
 * e copiate i file twitter4j-media-support-3.0.3.jar e twitter4j-core-3.0.3.jar
 * nella directory ImageJ/jre/lib/ext nei
 * sistemi Windows o Linux o nella cartella /Library/Java/Extensions/ su Mac OSX .
 * Una volta copiata la libreria esterna installate il plugin copiando il file .java
 * nella directory Plugins di ImageJ e dal menu Plugins di ImageJ cliccate la voce
 * Compile And Run... selezionate il file Tweet_Search.java e avrete installato il
 * plugins.
 *
 *
 * UTILIZZO :
 *
 * Inserite le chiavi e successivamente inserire la parola chiave per la quale si desidera effettuare la ricerca
 * nell'apposita text-box. 
 * Successivamente viene aperto il browser web automaticamente nel quale e' necessario autorizzare l'applicazione
 * affinche' venga visualizzato un PIN di accesso necessario all'autenticazione.
 * Questo PIN deve essere inserito nell'apposita finestra di dialogo.
 *
 */



import ij.*;
import ij.process.*;
import ij.gui.*;
import java.awt.*;
import ij.plugin.*;
import ij.plugin.frame.*;
import ij.plugin.filter.*;
import ij.plugin.filter.ExtendedPlugInFilter;
import ij.plugin.filter.PlugInFilterRunner;
import ij.gui.GenericDialog;
import ij.gui.GenericDialog.*;
import ij.gui.DialogListener;
import javax.swing.JOptionPane;
import java.awt.Desktop;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import twitter4j.MediaEntity;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import twitter4j.conf.ConfigurationBuilder;

public class Tweet_Search implements PlugIn {

    String consumerKey=JOptionPane.showInputDialog("Inserisci Consumer Key");
    String consumerSecret=JOptionPane.showInputDialog("Inserisci Secret Key");
    //String keyword="Parola chiave da cercare";
    
    String query="";

    	public void run(String arg)  {
        
        	//GenericDialog gd = new GenericDialog("Tweet Search");
  
        	//gd.setOKLabel("CERCA");
        	//gd.hideCancelButton();
        	//gd.setInsets(30,40,0);
        
        
        	//gd.addStringField("Inserisci Keyword per la ricerca", keyword, 16);
        	query = JOptionPane.showInputDialog("Inserisci Parola da Cercare");

        
            try {

        		
        		Twitter twitter = TwitterFactory.getSingleton();
                twitter.setOAuthConsumer(consumerKey, consumerSecret);
                
        		//consumerKey = twitter.getConfiguration().getOAuthConsumerKey();
        		//consumerSecret = twitter.getConfiguration().getOAuthConsumerSecret();
        		RequestToken requestToken = twitter.getOAuthRequestToken();
                
                // modifiche
                AccessToken accessToken = null;
                
                while (null == accessToken) {
                    URI url = new URI(requestToken.getAuthorizationURL());
                    Desktop.getDesktop().browse(url);
                    String pin=JOptionPane.showInputDialog("Inserisci PIN che compare sul browser web");
                
                try{
                	if(pin.length() > 0){
                    	accessToken = twitter.getOAuthAccessToken(requestToken, pin);
                	}
                	else{
                    	accessToken = twitter.getOAuthAccessToken();
                	}
            	} 
            	catch (TwitterException te) {
                	if(401 == te.getStatusCode()){
                    	System.out.println("Impossibile ottenere l'access token.");
                	}
                	else
                	{
                		te.printStackTrace();
                	}
            	}
                }
            	
				Twitter connessione = twitter;
        		String log_file_addr = System.getenv("HOME")+"/logTweetSearch.txt";
        		FileWriter log_file = new FileWriter(log_file_addr);
        		writeLogFileHeader(log_file, query);

        		ArrayList<String> elenco_foto= searchPhotos(query, connessione, log_file);
        		log_file.write("\n*****\n");
        		log_file.write("La ricerca ha restituito "+elenco_foto.size()+" foto.\n\n");
        		buildWebPage(elenco_foto);
        
        		log_file.close();
              
        	    }
        
        	catch ( URISyntaxException e2 )
        	{
            	System.out.println("Errore Sintassi URL");
            	e2.printStackTrace();
        	}
        
        	catch ( TwitterException e1 )
        	{
            	System.out.println("Twitter Exception");
            	e1.printStackTrace();
        	}
        
        	catch ( IOException e )
        	{
            	System.out.println("Errore I/O oppure TwitterException");
            	e.printStackTrace(); 
  	        }
            
        }
    
        public static ArrayList<String> searchPhotos(String q, Twitter t, FileWriter file) throws TwitterException, IOException {
        ArrayList<String> photo_links = new ArrayList();
        Query query = new Query(q);
        QueryResult result = t.search(query);
        
        for(Status status : result.getTweets()){
            file.write("Utente: @"+status.getUser().getScreenName()+"\n");
            file.write("Tweet: \""+status.getText()+"\"\n"+"\n");
            MediaEntity[] medias = status.getMediaEntities();
            if (medias.length>0)
                for(int i=0; i<medias.length; i++){
                    if(medias[i].getType().equals("photo"))
                        photo_links.add(medias[i].getMediaURL());
                    
                }
            
        }
        
        return photo_links;
    }
    
    
    public static void buildWebPage(ArrayList<String> lista_addr) throws IOException, URISyntaxException {
        for (int i=0; i<lista_addr.size();i++) {
            if ( lista_addr.get(i) != null) {
                
                ImagePlus imp = new ImagePlus(lista_addr.get(i));
                imp.show();
            }
        }
        ImagesToStack maker = new ImagesToStack();
        maker.run("Images to Stack");
    }
	
    public static void writeLogFileHeader(FileWriter log_file, String query) throws IOException{
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        Date date = new Date();
        log_file.write("\n*****************************************\n");
        log_file.write("ImageJ - Twitter Search Plugin\n\n");
        log_file.write("Ricerca effettuata il: "+dateFormat.format(date)+"\n");
        log_file.write("Argomento: \""+query+"\"");
        log_file.write("\n*****************************************\n\n\n");   
    }
    }
