/* 
 * PANORAMICA :
 *
 * Fb_Search e' un plugin della suite Query_Repo, serve ad interrogare
 * i repository online dei maggiori social network in particolare Facebook.
 * Si presenta con una semplice interfaccia grafica dove e' possibile effettuare
 * ricerche per parole chiave selezionando l'intervallo di tempo nel quale
 * effettuare la ricerca. La ricerca genera un file denominato logFbSearch.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 token di accesso
 * a facebook reperibile all'indirizzo : developers.facebook.com/tools/explorer/‎
 *
 *  N.B.: E' NECESSARIO ESSERE REGISTRATI A FACEBOOK COME SVILUPPATORI
 *
 * Cliccare su Get Access Token e copiare la stringa presente nella text-box 
 * e incollarla all'interno del frame che comparira' all'esecuzione del plugin
 *
 *  N.B.: L' Access Token e' valido per poche ore quindi eventuali errori o
 *        eccezioni possono essere risolte aggiornando il token di accesso
 *        come spiegato qualche riga sopra.
 *
 *
 *
 * INSTALLAZIONE :
 *
 * Per installare questo plugin bisogna importare le librerie restfb disponibili 
 * all'indirizzo http://restfb.com/#download una volta scaricato l'archivio estraete
 * e copiate il file restfb-version.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 Fb_Search.java e avrete installato il
 * plugins. 
 *
 * 
 * UTILIZZO :
 *
 * Inserite l'access Token e successivamente inserire la parola chiave per la quale si desidera effettuare la ricerca 
 * nell'apposita text-box. Selezionate l'intervallo di ricerca tra quelli
 * nel menu spuntando quello desiderato (default : Qualsiasi). Cliccare su CERCA 
 * e attendere la comparsa del menu di creazione dello stack di immagini, cliccare su OK e attendere il messaggio di fine ricerca.
 *
 */



// Import per ImageJ
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 per la ricerca su FB
import com.restfb.Connection;
import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.Parameter;
import com.restfb.types.Photo;
import com.restfb.types.Photo.Image;
import com.restfb.types.Post;
import java.util.Date;
import com.restfb.types.User;
import java.util.List;

// Import per la stampa
import java.io.FileWriter;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.awt.Desktop;
import java.net.URL;
import java.net.MalformedURLException;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
	


public class Fb_Search implements PlugIn {
    
    public String today = "Oggi";
    public String yesterday = "Ieri ";
    public String lastWeek = "Ultima Settimana";
    public String lastMonth = "Ultimo Mese";
    public String lastYear = "Ultimo Anno";
    public String whatever = "Qualsiasi";
    public String keyword = "Parola chiave da cercare";
    public String key2 ="";
    
    
    String token = JOptionPane.showInputDialog("Inserisci Token di Accesso");
	
    FacebookClient fbclient=new DefaultFacebookClient(token);
    
    User user = fbclient.fetchObject("me", User.class);
    
    String owner = user.getId();

    public void run(String arg)  {
        
        GenericDialog gd = new GenericDialog("FB Search");
  
        gd.setOKLabel("CERCA");
        gd.hideCancelButton();
        
        gd.setInsets(30,40,0);
        
        key2 = gd.getNextString();
        gd.addStringField("Inserisci Keyword :", keyword,16);
        
        gd.addMessage("\n"+"\t"+"\t"+"Seleziona Intervallo di Ricerca :");
        gd.addCheckbox(today,false);
        gd.addCheckbox(yesterday,false);
        gd.addCheckbox(lastWeek,false);
        gd.addCheckbox(lastMonth,false);
        gd.addCheckbox(lastYear,false);
        gd.addCheckbox(whatever,true);
        gd.showDialog();
        
        Connection<Photo> photos = null;
    
        ArrayList<String> links_addr = new ArrayList();

        if (gd.getNextBoolean() == true ) {
            IJ.showMessage("Ricerca Iniziata");
            photos = fbclient.fetchConnection("search",Photo.class, Parameter.with("q",gd.getNextString()),Parameter.with("since","today"),Parameter.with("limit",1000));
            int count=0;
            String text = System.getenv("HOME")+"/logFbSearch.txt";
            
            try {
                FileWriter sb2 = new FileWriter(text);
                    for(Photo p : photos.getData()){
                        count++;
                        sb2.write("\nNumero: "+count+"\n");
                        sb2.write("\nNome: "+p.getName());
                        sb2.write("\nData creazione: "+p.getCreatedTime());
                        sb2.write("\nAutore: "+p.getFrom().getName());
                        sb2.write("\nPicture: "+p.getLink());
                        links_addr.add(p.getPicture());
                }
                
        		
                sb2.close();
                            
                try {
                    buildWebPage(links_addr);}
                catch (URISyntaxException e ) {
                    e.printStackTrace();
                }
                IJ.showMessage("Ricerca Terminata");
            }
            
            catch ( IOException e )
            {
                System.out.println("Errore di I/O");
                e.printStackTrace();
            }

        }
        else if (gd.getNextBoolean() == true )
        {
           IJ.showMessage("Ricerca Iniziata");
            photos = fbclient.fetchConnection("search",Photo.class, Parameter.with("q",gd.getNextString()),Parameter.with("since","yesterday"),Parameter.with("limit",1000));
            int count=0;
            String text = System.getenv("HOME")+"/logFbSearch.txt";
            
            try {
                FileWriter sb2 = new FileWriter(text);
                for(Photo p : photos.getData()){
                    count++;
                    sb2.write("\nNumero: "+count+"\n");
                    sb2.write("\nNome: "+p.getName());
                    sb2.write("\nData creazione: "+p.getCreatedTime());
                    sb2.write("\nAutore: "+p.getFrom().getName());
                    sb2.write("\nPicture: "+p.getLink());
                    links_addr.add(p.getPicture());
                }
                sb2.close();
                try {
                    buildWebPage(links_addr);}
                catch (URISyntaxException e ) {
                    e.printStackTrace();
                }

                IJ.showMessage("Ricerca Terminata");
            }
            catch ( IOException e )
            {
                System.out.println("Errore di I/O");
                e.printStackTrace();
            }

        }
        else if (gd.getNextBoolean() == true ) {
            IJ.showMessage("Ricerca Iniziata");
            photos = fbclient.fetchConnection("search",Photo.class, Parameter.with("q",gd.getNextString()),Parameter.with("since","last Week"),Parameter.with("limit",1000));
            int count=0;
            String text = System.getenv("HOME")+"/logFbSearch.txt";
            IJ.showMessage("Ricerca Iniziata");
             FileWriter sb2 = null;
            try {
                sb2 = new FileWriter(text);
                for(Photo p : photos.getData()){
                    count++;
                    sb2.write("\nNumero: "+count+"\n");
                    sb2.write("\nNome: "+p.getName());
                    sb2.write("\nData creazione: "+p.getCreatedTime());
                    sb2.write("\nAutore: "+p.getFrom().getName());
                    sb2.write("\nPicture: "+p.getLink());
                    links_addr.add(p.getPicture());
                }
                 sb2.close();
                IJ.showMessage("Ricerca Terminata");
                
            }
            
            catch ( IOException e )
            {
                System.out.println("Errore di I/O");
                e.printStackTrace();
            }
            
            try {
                buildWebPage(links_addr);}
            catch (URISyntaxException e ) {
                    e.printStackTrace();
            }
            
            catch ( IOException e )
            {
                System.out.println("Errore di I/O");
                e.printStackTrace();
            }
            
        }
        else if ( gd.getNextBoolean() == true ) {
            IJ.showMessage("Ricerca Iniziata");
            photos = fbclient.fetchConnection("search",Photo.class, Parameter.with("q",gd.getNextString()),Parameter.with("since","last Month"),Parameter.with("limit",1000));
            int count=0;
            String text = System.getenv("HOME")+"/logFbSearch.txt";
            
            try {
                FileWriter sb2 = new FileWriter(text);
                for(Photo p : photos.getData()){
                    count++;
                    sb2.write("\nNumero: "+count+"\n");
                    sb2.write("\nNome: "+p.getName());
                    sb2.write("\nData creazione: "+p.getCreatedTime());
                    sb2.write("\nAutore: "+p.getFrom().getName());
                    sb2.write("\nPicture: "+p.getLink());
                    links_addr.add(p.getPicture());
                }
                sb2.close();
                try {
                    buildWebPage(links_addr);}
                catch (URISyntaxException e ) {
                    e.printStackTrace();
                }

                IJ.showMessage("Ricerca Terminata");
            }
            catch ( IOException e )
            {
                System.out.println("Errore di I/O");
                e.printStackTrace();
            }
        }
        else if (gd.getNextBoolean() == true ) {
            IJ.showMessage("Ricerca Iniziata");
            photos = fbclient.fetchConnection("search",Photo.class, Parameter.with("q",gd.getNextString()),Parameter.with("since","last Year"),Parameter.with("limit",1000));
            int count=0;
            String text = System.getenv("HOME")+"/logFbSearch.txt";
            
            try {
                FileWriter sb2 = new FileWriter(text);
                for(Photo p : photos.getData()){
                    count++;
                    sb2.write("\nNumero: "+count+"\n");
                    sb2.write("\nNome: "+p.getName());
                    sb2.write("\nData creazione: "+p.getCreatedTime());
                    sb2.write("\nAutore: "+p.getFrom().getName());
                    sb2.write("\nPicture: "+p.getLink());
                    
                    links_addr.add(p.getPicture());
                }
                sb2.close();
                try {
                    buildWebPage(links_addr);}
                catch (URISyntaxException e ) {
                    e.printStackTrace();
                }

                IJ.showMessage("Ricerca Terminata");
            }
            catch ( IOException e )
            {
                System.out.println("Errore di I/O");
                e.printStackTrace();
            }

        }
        else {
           IJ.showMessage("Ricerca Iniziata");
            photos = fbclient.fetchConnection("search",Photo.class, Parameter.with("q",gd.getNextString()),Parameter.with("limit",1000));
            int count=0;
            String text = System.getenv("HOME")+"/logFbSearch.txt";
            
            try {
                FileWriter sb2 = new FileWriter(text);
                for(Photo p : photos.getData()){
                    count++;
                    sb2.write("\nNumero: "+count+"\n");
                    sb2.write("\nNome: "+p.getName());
                    sb2.write("\nData creazione: "+p.getCreatedTime());
                    sb2.write("\nAutore: "+p.getFrom().getName());
                    sb2.write("\nPicture: "+p.getLink());
                    links_addr.add(p.getPicture());
                }
                sb2.close();
                try {
                    buildWebPage(links_addr);}
                catch (URISyntaxException e ) {
                    e.printStackTrace();
                }

                IJ.showMessage("Ricerca Terminata");
            }
            catch ( IOException e )
            {
                System.out.println("Errore di I/O");
                e.printStackTrace();
            }
        }
    }
    
    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");
    }
}
