/**
 * A sample program that traverse the network. 
 * @author Kiminori Matsuzaki
 */

import java.io.*;
import java.util.*;

class NetworkSample {
  void showUsageAndExit( ) {
    System.err.println( "usage: java Prog1 <initial URL> <restricted domain>" );
    System.exit( 1 );
  }

  void mainRoutine( String[] args ) {
    if ( args.length < 2 ) showUsageAndExit( );

    String urlString = args[ 0 ];
    String domainString = args[ 1 ];

    GraphUtil graph = new GraphUtil( );
    graph.addNode( "Initial", "No title" );

    Link link = new Link( "Initial", urlString );

    for ( int i = 0; i < 10; i++ ) {
      urlString = link.toURL;
      
      // If the next URL is out of the domain, stop traversing 
      if ( urlString.indexOf( domainString ) < 0 ) {
	System.out.println( "Out of domain: " + urlString );
	graph.addNode( urlString, "Out of domain" );
	graph.addLink( link );
	
	break;
      }

      String[] typeAndPage = NetworkUtil.connectAndRead( urlString );
      if ( typeAndPage == null ) {
	System.out.println( "Cannot read URL: " + urlString );
	graph.addNode( urlString, "No URL" );
	graph.addLink( link );
	break;
      }

      if ( typeAndPage[ 0 ].indexOf( "text/html" ) < 0 ) {
	// not an html file
	System.out.println( "Get URL: " + urlString + ", " + 
			    "title: " + typeAndPage[ 0 ] );
	graph.addNode( urlString, typeAndPage[ 0 ] );
	graph.addLink( link );
	break;
      }
	  
      // html file
      HTMLPageInfo info = NetworkUtil.analyzeHTML( typeAndPage[ 1 ], urlString );
      System.out.println( "Get URL: " + urlString + ", " + 
			  "title: " + info.title );
      graph.addNode( urlString, info.title );
      graph.addLink( link );

      if ( info.pageLists.size( ) == 0 ) break;

      // randomly choose the next page
      int nextIndex = ( int ) ( Math.random( ) * info.pageLists.size( ) );
      String nexturl = ( String ) info.pageLists.get( nextIndex );

      link = new Link( urlString, nexturl );
    }

    try {
      graph.outputToFile( "graph.txt" );
    }
    catch ( Exception e ) {
      e.printStackTrace( );
    }
  }

  public static void main( String[] args ) {
    new NetworkSample( ).mainRoutine( args );
  }
}
