package milesd.aircool.parser;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.log4j.Logger;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.beans.FilterBean;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.HasChildFilter;
import org.htmlparser.filters.HasParentFilter;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.StringFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.Span;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

public class ForSaleParser {
	
	static Logger logger = Logger.getLogger("Parser.class");
	
	private String parseREGEXP(String myStr, String filter, int subStringStartVAL, int subStringEndVAL ) {
		Pattern p = Pattern.compile( filter );
		Matcher m = p.matcher( myStr );
		String foundVal = null;
		while( m.find() ) {
		      logger.debug( "\t" + m.group() + " " + myStr.substring(m.start()+subStringStartVAL, m.end()-subStringEndVAL ));
		      foundVal = myStr.substring(m.start()+subStringStartVAL, m.end()-subStringEndVAL );
		      return ( foundVal );
		      
		}
		return ( myStr );
	}
	
	
	
	

	private String parseVZIForSale( String myURL) {
    	NodeClassFilter filter0 = new NodeClassFilter ();
        try { 
        	filter0.setMatchClass (Class.forName ("org.htmlparser.tags.TableColumn")); 
        } catch (ClassNotFoundException cnfe) { 
        	cnfe.printStackTrace (); 
        }
        HasAttributeFilter filter1 = new HasAttributeFilter ();
        filter1.setAttributeName ("class");
        filter1.setAttributeValue ("alt1");
        NodeFilter[] array0 = new NodeFilter[2];
        array0[0] = filter0;
        array0[1] = filter1;
        AndFilter filter2 = new AndFilter ();
        filter2.setPredicates (array0);
        NodeFilter[] array1 = new NodeFilter[1];
        array1[0] = filter2;
    	
    	
        FilterBean myBean = new FilterBean ();
        myBean.setFilters (array1);
        myBean.setURL( myURL );
        String outBuffer = new String();
        
        //logger.debug( myBean.getNodes ().toHtml() );
        NodeList myNodeList = myBean.getNodes ();

        for (int i = 0; i < myNodeList.size (); i++) {
        	String myStr = myNodeList.elementAt (i).toHtml ();
        	
        	
        	if ( myStr.contains("threadtitle_") ) {
        		String myLink = parseREGEXP(myStr, "thread_title_\\d+", 13, 0 );
        		myLink = "<a href=\"http://www.volkszone.com/VZi/showthread.php?t=" + myLink + "\">";
        		
        		String myTitle = parseREGEXP(myStr, "thread_title_[0-9]+\">[^<]+", 21, 0 ) + "</a>";
        		
        		String myDesc = "<p>" + parseREGEXP(myStr, "title=\"[^>]+", 7, 1 ) + "</p>";
        		logger.debug ( "*" + myLink + "\n**" + myTitle + "\n*** " + myDesc + "\n" );
        		outBuffer = outBuffer + myLink + myTitle + myDesc + "\n" ;
        	}
        }
        
		return ( outBuffer );
	}
	
	private String parseVolksTorqueForSale( String myURL) {
    	NodeClassFilter filter0 = new NodeClassFilter ();
        try { 
        	filter0.setMatchClass (Class.forName ("org.htmlparser.tags.TableColumn")); 
        } catch (ClassNotFoundException cnfe) { 
        	cnfe.printStackTrace (); 
        }
        HasAttributeFilter filter1 = new HasAttributeFilter ();
        filter1.setAttributeName ("class");
        filter1.setAttributeValue ("alt1");
        NodeFilter[] array0 = new NodeFilter[2];
        array0[0] = filter0;
        array0[1] = filter1;
        AndFilter filter2 = new AndFilter ();
        filter2.setPredicates (array0);
        NodeFilter[] array1 = new NodeFilter[1];
        array1[0] = filter2;
    	
    	
        FilterBean myBean = new FilterBean ();
        myBean.setFilters (array1);
        myBean.setURL( myURL );
        String outBuffer = new String();
        
        //logger.debug( myBean.getNodes ().toHtml() );
        NodeList myNodeList = myBean.getNodes ();

        for (int i = 0; i < myNodeList.size (); i++) {
        	String myStr = myNodeList.elementAt (i).toHtml ();
        	
        	/*
        	 * 
        	 * We want to avoid the stick postings - so we look for sticky.gif
        	 * 
        	 */
        	
        	if ( myStr.contains("sticky.gif") ) {
        		continue;
        	}
        	
        	if ( myStr.contains("threadtitle_") ) {
        		String myLink = parseREGEXP(myStr, "thread_title_\\d+", 13, 0 );
        		myLink = "<a href=\"http://www.volkstorque.co.uk/vt/showthread.php?t=" + myLink + "\">";
        		
        		String myTitle = parseREGEXP(myStr, "thread_title_[0-9]+\">[^<]+", 20, 0 ) + "</a>";

        		String myDesc = "<p>" + parseREGEXP(myStr, "title=\"[^>]+", 7, 1 ) + "</p>";
        		logger.debug ( "*" + myLink + "\n**" + myTitle + "\n*** " + myDesc + "\n" );
        		outBuffer = outBuffer + myLink + myTitle + myDesc + "\n" ;
        	}
        }
        
		return ( outBuffer );
	}
	
	private String parseSSVCForSale( String myURL) {
		String outBuffer= new String();
		
		TagNameFilter filter0 = new TagNameFilter ();
        filter0.setName ("A");
        HasAttributeFilter filter1 = new HasAttributeFilter ();
        filter1.setAttributeName ("class");
        filter1.setAttributeValue ("topictitle");
        NodeFilter[] array0 = new NodeFilter[2];
        array0[0] = filter0;
        array0[1] = filter1;
        AndFilter filter2 = new AndFilter ();
        filter2.setPredicates (array0);
        NodeFilter[] array1 = new NodeFilter[1];
        array1[0] = filter2;
        FilterBean myBean = new FilterBean ();
        myBean.setFilters (array1);
        myBean.setURL( myURL );
        
        //logger.debug( myBean.getNodes ().toHtml() );
        NodeList myNodeList = myBean.getNodes ();

        for (int i = 0; i < myNodeList.size (); i++) {
        	String myStr = myNodeList.elementAt (i).toHtml ();
        	
        	if ( myStr.contains("viewtopic") ) {
        		String myLink = parseREGEXP(myStr, "viewtopic.php?[^>]+", 0, 20 );
        		myLink = "<a href=\"http://www.ssvc.org.uk/phpbb/" + myLink + "\">";
        		
        		String myTitle = parseREGEXP(myStr, "class=\"topictitle\">[^<]+", 19, 0 ) + "</a>";
        			
        		logger.debug ( "***** >>> " + myLink + "****" + myTitle + "\n");
        		
        		//logger.debug ( "*" + myLink + "\n**" + myTitle + "\n*** " + myDesc + "\n" );
        		//outBuffer = outBuffer + myLink + myTitle + myDesc + "\n" ;
        	}
        	
        	
        	
        	
        	
        	
        	
        	
        	
        	
        	
        	
        	
        	
        	
        	
        	
        	
        	myStr = myStr.replace("viewtopic.php", "http://www.ssvc.org.uk/phpbb/viewtopic.php");
        	logger.debug ( "<p>" + myStr + "</p>" );
        	outBuffer = outBuffer + "<p>" + myStr + "</p>\n";
        }
        
        return ( outBuffer );
	}
	
	private String parseTheSambaForSale(String myURL) {
		String outBuffer= new String();
		
		NodeClassFilter filter0 = new NodeClassFilter ();
	    try { filter0.setMatchClass (Class.forName ("org.htmlparser.tags.TableColumn")); } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace (); }
	    HasAttributeFilter filter1 = new HasAttributeFilter ();
	    filter1.setAttributeName ("class");
	    filter1.setAttributeValue ("gen");
	    NodeFilter[] array0 = new NodeFilter[2];
	    array0[0] = filter0;
	    array0[1] = filter1;
	    AndFilter filter2 = new AndFilter ();
	    filter2.setPredicates (array0);
	    NodeFilter[] array1 = new NodeFilter[1];
	    array1[0] = filter2;
	    FilterBean bean = new FilterBean ();
	    bean.setFilters (array1);
	    FilterBean myBean = new FilterBean ();
        myBean.setFilters (array1);
        myBean.setURL( myURL );
	    NodeList myNodeList = myBean.getNodes ();
	    
	    for (int i = 0; i < myNodeList.size (); i++) {
	    	// we are not interested in the image - so we increment
	    	i++;
	    	
	    	// we want the title and the link
        	String myStr = myNodeList.elementAt (i).toHtml ();

        	// "detail.php?id=630873"
        	String linkURL = parseREGEXP(myStr, "<a href=\"detail.php\\?id=[^<]+</a>", 0, 0 );
        	
        	linkURL = linkURL.replace("detail.php", "http://www.thesamba.com/vw/classifieds/detail.php");
        	// skip the price 
        	i++;
        	// skip the location 
        	i++;
        	
        	logger.debug ( "<p>" + myStr + "</p>" );
        	outBuffer = outBuffer + "<p>" + linkURL + "</p>\n";
        }
	    
	    
	    
	    return ( outBuffer );
	}
	
	
	
	
	
	
	
	
	
	
	
	private String header() {
		return ("<HTML>\n<HEAD>" + getCSS() + "</HEAD>\n<BODY>\n" );
	}
	
	private String getCSS() {
		return ( "<link rel=\"stylesheet\" type=\"text/css\" href=\"stylesheet.css\" />" );
	}
	
	private String footer() {
		return ("</BODY>\n</HTML>" );
	}
	
	
	public static void main(String[] args) {
		logger.debug( "START" );
		ForSaleParser myParser = new ForSaleParser();
		String file = "index.html";
		PrintWriter outFile = null;
		try {
			outFile = new PrintWriter(new BufferedWriter(new FileWriter(file)));
		} catch (IOException e) {
			e.printStackTrace();
		}
		StringBuffer finalBuffer = new StringBuffer();
		finalBuffer.append( myParser.header() );
		finalBuffer.append("<A NAME=\"top\">");
		finalBuffer.append("<div id=\"names\">");
		finalBuffer.append("<a href=\"#ssvc\">SSVC</a> <a href=\"#volkszone\">VOLKSZONE</a> <a href=\"#volkstorque\">VOLKSTORQUE</a> <a href=\"#thesamba\">THESAMBA</a>");
		finalBuffer.append("</div>");
		finalBuffer.append("<div id=\"ssvc\">");
		finalBuffer.append("<A NAME=\"ssvc\"></A><P><H2>SSVC</H2></P>");
		finalBuffer.append( myParser.parseSSVCForSale( "http://www.ssvc.org.uk/phpbb/viewforum.php?f=4" ) );
		finalBuffer.append("</div>");
		finalBuffer.append("<div id=\"volkszone\">");
		finalBuffer.append("<A NAME=\"volkszone\"><P><H2>VOLKSZONE</H2></P>");
		finalBuffer.append(myParser.parseVZIForSale( "http://www.volkszone.com/VZi/forumdisplay.php?f=42" ) );
		finalBuffer.append("</div>");
		finalBuffer.append("<div id=\"volkstorque\">");
		finalBuffer.append("<A NAME=\"volkstorque\"><P><H2>VOLKSTORQUE</H2></P>");
		finalBuffer.append(myParser.parseVolksTorqueForSale( "http://www.volkstorque.co.uk/vt/forumdisplay.php?f=58" ) );
		finalBuffer.append("</div>");
		finalBuffer.append("<div id=\"thesamba\">");
		finalBuffer.append("<A NAME=\"thesamba\"><P><H2>THESAMBA</H2></P>");
		finalBuffer.append(myParser.parseTheSambaForSale( "http://www.thesamba.com/vw/classifieds/cat.php?id=31" ) );
		finalBuffer.append("</div>");
		finalBuffer.append("<a href=\"#top\">TOP OF PAGE</a>");
		finalBuffer.append( myParser.footer() );
		outFile.println( finalBuffer );
		
		outFile.close();
		logger.debug( "END" );

	}

}
