package traffic;

import java.io.InputStream;
import java.net.URL;

import java.util.*;
import java.awt.*;
import java.applet.Applet;


  public class Crossroad extends Applet {

  GraphPanel panel;
  int carnum;
  Thread LightThrd = new Thread();

  public void init() {
    setLayout(new BorderLayout());
    panel = new GraphPanel(this);
    add("Center", panel);

    carnum = Integer.parseInt(getParameter("carnum"));
    for (int k=0; kbrgright[k])&&brgflag[k]==1){  
            if(temp> brgleft[k] ||tempbrgright[k])&&brgflag[k]==0)
            if (light.signal==0)
              brgflag[k]=1;
            else
              n.x=temp;
            else if(temp< brgleft[k] &&temp>brgright[k])
              brgflag[k]=0;
          
          if (n.x < 0) {
            n.x = d.width-10*Math.random();
            carpermin[0].vehicleNumber=carpermin[0].vehicleNumber+1;
          } else if (n.x > d.width) {
            n.x = d.width-10*Math.random();
          }
          
          if (n.x!=temp&&n.wait==-1){
            carpermin[0].vehicleWait+= System.currentTimeMillis()- n.wait;
            n.wait=-1;
          }
        }
      } else{
        temp=n.y;
	      n.y += Math.max(-10, Math.min(10, n.dY));

        if ((n.ybrgbottom)&&brgflag[n.road-1]==1){  
           if(temp> brgtop ||tempbrgbottom)&&brgflag[n.road-1]==0)
            if (light.signal==1)
              brgflag[n.road-1]=1; 
            else
              n.y=temp;
            else if(temp< brgtop &&temp>brgbottom)
              brgflag[n.road-1]=0;

        if (n.y > d.height||n.y<0) {
          n.y = 10*Math.random();
          carpermin[0].vehicleNumber=carpermin[0].vehicleNumber+1;
        }
      }
	  }
	  
    repaint();
  } //end of relax method

  Vehicle pick;
  double pickoldx, pickoldy;
  Image offscreen;
  Dimension offscreensize;
  Graphics offgraphics;

  final Color selectColor = Color.pink;
  final Color edgeColor = Color.black;
  final Color vehicleColor = new Color(250, 135, 250);

  public void paintVehicle(Graphics g, Vehicle n) {
    int x = (int)n.x;
    int y = (int)n.y;
    g.setColor((n == pick) ? selectColor : vehicleColor); 
    int w = n.width;                             
    int h = n.length;
    g.fillRoundRect(x - w/2, y - h/2, w, h, w/3,h/3);
    g.setColor(Color.black);
    g.drawRoundRect(x - w/2, y - h/2, w-1, h-1,w/3,h/3);
    int dim;
    dim = Math.min (w, h);
    g.drawRect(x - dim/3, y - dim/3, dim*2/3, dim*2/3);
    
  }

  public void paintRoad(Graphics g){
    Dimension d = size();
    g.setColor(Color.gray);
    for(int k=1; k<2; k++){
         g.drawLine(rdleft[k], 0, rdleft[k], rdbottom);
         g.drawLine(rdleft[k], rdtop, rdleft[k], d.height);
         g.drawLine(rdright[k], 0, rdright[k], rdbottom);
         g.drawLine(rdright[k], rdtop, rdright[k], d.height);
         g.drawLine(rdright[k-1], rdtop, rdleft[k], rdtop);
         g.drawLine(rdright[k-1], rdbottom, rdleft[k], rdbottom);
        }
    g.drawLine(rdright[1], rdbottom, d.width, rdbottom);
    g.drawLine(rdright[1], rdtop, d.width, rdtop);   
  }


  public void paintLights(Graphics g){
    int lightwidth=15;
    for(int k=1; k<2; k++){
       g.setColor(Color.black);
       g.fillRect(rdleft[k]-carwidth - lightwidth, rdtop- 7 * carwidth, lightwidth-2,3* lightwidth); 
       g.fillRect(rdleft[k]+ 3 * carwidth, rdtop+4, 3*lightwidth, lightwidth-2); 
       
       if (light.signal==1){
        g.setColor(Color.red);
        g.fillOval(rdleft[k]-carwidth - lightwidth, rdtop- 7 * carwidth, lightwidth-2, lightwidth-2);

        g.setColor(Color.black);
        g.fillOval(rdleft[k]-carwidth - lightwidth, rdtop- 4*carwidth, lightwidth-2, lightwidth-2);
        g.fillOval(rdleft[k]+ 3 * carwidth, rdtop+4, lightwidth-2, lightwidth-2); 
        
        g.setColor(Color.green);
        g.fillOval(rdleft[k]+ 6 * carwidth, rdtop+4, lightwidth-2, lightwidth-2); 
       }

       if (light.signal==0){
        g.setColor(Color.red);
        g.fillOval(rdleft[k]+ 3 * carwidth, rdtop+4, lightwidth-2, lightwidth-2); 
        
        g.setColor(Color.black);
        g.fillOval(rdleft[k]+ 6 * carwidth, rdtop+4, lightwidth-2, lightwidth-2); 
        g.fillOval(rdleft[k]-carwidth - lightwidth, rdtop- 7 * carwidth, lightwidth-2, lightwidth-2);
        
        g.setColor(Color.green);
        g.fillOval(rdleft[k]-carwidth - lightwidth, rdtop- 4*carwidth, lightwidth-2, lightwidth-2);
        
       }

       if (light.signal==2){
        g.setColor(Color.black);
        g.fillOval(rdleft[k]+ 3 * carwidth, rdtop+4, lightwidth-2, lightwidth-2); 
        g.fillOval(rdleft[k]+ 6 * carwidth, rdtop+4, lightwidth-2, lightwidth-2); 
        g.fillOval(rdleft[k]-carwidth - lightwidth, rdtop- 7 * carwidth, lightwidth-2, lightwidth-2);
        g.fillOval(rdleft[k]-carwidth - lightwidth, rdtop- 4*carwidth, lightwidth-2, lightwidth-2);

        g.setColor(Color.yellow);
        g.fillOval(rdleft[k]+ 5 * carwidth, rdtop+4, lightwidth-2, lightwidth-2); 
        g.fillOval(rdleft[k]-carwidth - lightwidth, rdtop- 5 * carwidth, lightwidth-2, lightwidth-2);
       }
/**         g.setColor(light.signal==1 ? Color.red : Color.black);
         g.fillOval(rdleft[k]-carwidth - lightwidth, rdtop- 7 * carwidth, lightwidth-2, lightwidth-2);
         
         g.setColor(light.signal!=1 ? Color.green : Color.black);
         g.fillOval(rdleft[k]-carwidth - lightwidth, rdtop- 4*carwidth, lightwidth-2, lightwidth-2);
       
         g.setColor(light.signal==1 ? Color.green : Color.black);
         g.fillOval(rdleft[k]+ 6 * carwidth, rdtop+4, lightwidth-2, lightwidth-2); 
         g.setColor(light.signal!=1 ? Color.red : Color.black);
         g.fillOval(rdleft[k]+ 3 * carwidth, rdtop+4, lightwidth-2, lightwidth-2); 
       }
*/      }    
  }


  public synchronized void update(Graphics g) {

    Dimension d = size();
    if ((offscreen == null) || (d.width != offscreensize.width) || (d.height != offscreensize.height)) {
        offscreen = createImage(d.width, d.height);
        offscreensize = d;
        offgraphics = offscreen.getGraphics();
    }

    offgraphics.setColor(getBackground());
    offgraphics.fillRect(0, 0, d.width, d.height);
    paintRoad(offgraphics);
    
    //draw lights
    paintLights(offgraphics);
    
    //draw cars             
    for (int i = 0 ; i < nvehicles ; i++) {
      paintVehicle(offgraphics, vehicles[i]);
    }               
    g.drawImage(offscreen, 0, 0, null);
  
  }

  public void start() {
    relaxer = new Thread(this);
    relaxer.start();
  }
  
  public void stop() {
    relaxer.stop();
  }
}


}