import javax.swing.*;
import java.util.*;
public class Environ extends Location {
    protected int environID;
    protected char type;
    protected int size;
    protected String[] races;
    protected int resourceRating;
    protected boolean ishighMilUnitLevel;
    protected boolean reactionMoveOK;
    protected String creature;
    protected Sovereign sovereign;
    protected int coupRating;
   
    /** Constructor Method
     * @param id ID Number
     * @param t Type
     * @param s Size
     * @param environRaces Races in Environ
     * @param rating Resourse Rating
     * @param highLevel Allows High level purchases
     * @param environCreature Creatures
     * @param environCoup Coup Rating
     */
    public Environ(int id, char t, int s, String[] environRaces,
                   int rating, boolean highLevel, String environCreature,
                   int environCoup)
    {
        environID = id;
	size = s;
	type = t;
        resourceRating = rating;
        ishighMilUnitLevel = highLevel;
        creature = environCreature;
	planet = null; /* no planet until we join one */
        races = environRaces;
	rebelMilGroup = new MilitaryGroup('r');
	rebelCharGroup = new CharacterGroup('r');
	imperialMilGroup = new MilitaryGroup('i');
	imperialCharGroup = new CharacterGroup('i');
        coupRating = environCoup;
        sovereign = null; /* no sovereign until we summon one */
	reactionMoveOK = true;
    }

     static Environ AllEnviron[];   
    
   /**
    * accessor methods
    */
    
     /** get(int)
      * Returns Environ with matching ID
      * @param id Environ ID Number
      * @return Environ
      */   
    
 public static Environ get(int id)
  {
    int start = 0;
    int end = AllEnviron.length;
    int middle;

    while (start < end) {
        middle = (start + end)/2;

        if (AllEnviron[middle].environID == id)
          return AllEnviron[middle];

        else if (AllEnviron[middle].environID > id)
	  end = middle;

        else
          start = middle + 1;
    }

   System.err.println("ID number not found");

   return null;
  }
    
    /** getSize()
     * returns the size (int) of the environ (number of military units the
     * environ can hold)
     * @return Size of Environ
     */
   
    public int getSize()
    {
	return size;
    }
    /** getType()
     * returns the type (char) of the environ (urban, wild, etc.)
     * @return Environ Type
     */
    public char getType()
    {
	return type;
    }
    /** getStringType()
     * returns the type (String) of the environ (urban, wild, etc.)
     * @return String Version of Environ Type
     */
    public String getStringType()
    {
	if (type=='u'||type=='U')
	    return("Urban");
	else if (type=='w'||type=='W')
	    return("Wild");
	else if (type=='a'||type=='A')
	    return("Air");
	else if (type=='l'||type=='L')
	    return("Liquid");
	else if (type=='f'||type=='F')
	    return("Fire");
	else if (type=='s'||type=='S')
	    return("Subterranean");
	else
	    return("not an environ");
    }

    
    public String getRace(int i)
    {
     return races[i];   
    }
   /**
    * getReactionMoveOK()
    * returns true if a reaction move is allowed; false otherwise
    */
    
    public boolean getReactionMoveOK()
    {
	return reactionMoveOK;
    }
    /** getCreature
     * returns the name of the creature in that environ
     * @return Creature in Environ
     */
    public String getCreature()
    {
        return creature;
    }
   /**
    * addToMilGroup()
    * adds a Unit to a MilitaryGroup
    */
    public void addToMilGroup(MilitaryGroup m, Unit u)
    {
	m.add(u);
	return;
    }
    
    /**
     *addCharacter(Charactr c)
     *adds a character to the environment,
     *placing it in the correct CharacterGroup
     */
    public void addCharacter(Charactr c)
    {
        c.setEnviron(this);
        if(c.side=='r' || c.side=='R')
            rebelCharGroup.add(c);
        else
            imperialCharGroup.add(c);
    }
    /**remove Character()
     *removes a character from the environment
     */
    public void removeCharacter(Charactr c)
    {
        if(c.side=='r')
            rebelCharGroup.remove(c);
        else
            imperialCharGroup.remove(c);
    }
    
   /**
    * getReactionMoveOK()
    * returns true if a reaction move is allowed; false otherwise
    */
    
    public void setReactionMoveOK(boolean b)
    {
	reactionMoveOK = b;
    }    
    
    /** setPlanet()
     * "joins" a planet
     * @param p Planet
     */
    public void setPlanet(Planet p)
    {
        planet=p;
    }
     
    public int getResourceRating() {
      return resourceRating;
    }
   
    public String name()
    {
        return getStringType();
    }

    /**
     * getEnvironStarFaringRaces()
     * Returns a list of StarFaring Races in Environ
     * @return Vector of StarFaring Races
     */

    public Vector getEnvironStarFaringRaces()
    {
     Vector list = new Vector(1);
     Race currentRace;
     String race;

     for (int i = 0; i < races.length;i++) {
         currentRace = Race.get(races[i]);
         if (currentRace.getisStarFaring() && !list.contains(races[i])) {
           list.addElement(races[i]);
         }
     }
          
     return list;
    }

    /**
     * hasRace(String)
     * Returns if a race is in an environ
     * @param race Race searching for
     * @return True - In Environ, False - Not in Environ
     */

    public boolean hasRace(String race)
    {
     String fixedrace, currentrace;

     fixedrace = removetype(race);

     for (int i = 0; i < races.length;i++) {
         if (fixedrace.equals(removetype(races[i])))
            return true;
     }

     return false;
    }

    public String removetype(String race)
    {
     String newRace;
     int i;
     
     i = race.indexOf('_');
     
     if (i == -1)
        return race;

     newRace = race.substring(0,i);

     return newRace;
    }

 /**
  * init()
  * Initialize all Environ in game
  */

 public static void init() {
  AllEnviron = new Environ[83];
     
  String[] Anons = {"Anons"};
  String[] Ardorats = {"Ardorats"};  
  String[] Borks = {"Borks"};
  String[] Calmas = {"Calmas"};
  String[] Charkhans = {"Charkhans"};
  String[] Cavalkus = {"Cavalkus"};
  String[] Deaxins = {"Deaxins"};
  String[] Henones = {"Henones"};
  String[] Illias = {"Illias"};
  String[] Jopers = {"Jopers"};
  String[] KaynsW = {"Kayns_W"};
  String[] KaynsS = {"Kayns_S"};
  String[] Kirts = {"Kirts"};
  String[] Leonids = {"Leonids"};
  String[] Moghas = {"Moghas"};
  String[] Mowevs = {"Mowevs"};
  String[] Ornotins = {"Ornotins"};
  String[] Phans = {"Phans"};
  String[] PioradsU = {"Piorads_U"};
  String[] PioradsS = {"Piorads_S"};
  String[] RhonesU = {"Rhones_U"};
  String[] RhonesW = {"Rhones_W"};
  String[] RhonesS = {"Rhones_S"};
  String[] Rylians = {"Rylians"};
  String[] SauriansU = {"Saurians_U"};
  String[] SauriansW = {"Saurians_W"};
  String[] SauriansS = {"Saurians_S"};
  String[] SauriansL = {"Saurians_L"};
  String[] SegundensU = {"Segundens_U"};
  String[] SegundensL = {"Segundens_L"};
  String[] Susperans = {"Susperans_U"};
  String[] SuvansU = {"Suvans_U"};
  String[] SuvansL = {"Suvans_L"};
  String[] Theshians = {"Theshians"};
  String[] Thoks = {"Thoks"};
  String[] Ultraks = {"Ultraks"};
  String[] Urgaks = {"Urgaks"};
  String[] Ursi = {"Ursi"};
  String[] Xanthons = {"Xanthons"};
  String[] YestersU = {"Yesters_U"};
  String[] YestersA = {"Yesters_A"};
  String[] Environ1211 = {"Kayns_S", "Saurians_S"};
  String[] Environ1511 = {"Saurians_U", "Rhones_U"};
  String[] Environ2321 = {"Segundens_U", "Piorads_U"};
  String[] Environ3421 = {"Suvans_U", "Rhones_U"};
  String[] Environ4211 = {"Segundens_U","Rhones_U"};
               
     AllEnviron[0] = new Environ(1111,'W',4,KaynsW,4,false,"Prox",0);
     AllEnviron[1] = new Environ(1121,'U',3,RhonesU,6,false,"",0);
     AllEnviron[2] = new Environ(1122,'A',5,YestersA,7,true,"Glane",0);
     AllEnviron[3] = new Environ(1131,'L',4,SuvansL,4,true,"Dindin",3);
     AllEnviron[4] = new Environ(1132,'W',4,Urgaks,4,false,"",0);
     AllEnviron[5] = new Environ(1211,'S',6,Environ1211,7,true,"Crunge",0);
     AllEnviron[6] = new Environ(1221,'U',3,SegundensU,8,true,"",0);
     AllEnviron[7] = new Environ(1222,'L',3,SegundensL,7,true,"",0);
     AllEnviron[8] = new Environ(1223,'W',4,Borks,6,false,"Ymbarrors",0);
     AllEnviron[9] = new Environ(1311,'U',5,SegundensU,10,true,"Vorozion",0);
     AllEnviron[10] = new Environ(1411,'S',5,PioradsS,5,true,"Stromuse",0);
     AllEnviron[11] = new Environ(1421,'U',4,RhonesU,7,true,"Zernipaks",0);
     AllEnviron[12] = new Environ(1422,'W',5,RhonesW,7,true,"",0);
     AllEnviron[13] = new Environ(1431,'F',2,Xanthons,2,false,"",0);
     AllEnviron[14] = new Environ(1432,'W',4,SauriansW,6,true,"Zops",0);
     AllEnviron[15] = new Environ(1511,'U',4,Environ1511,7,true,"",0);
     AllEnviron[16] = new Environ(1512,'A',3,Anons,1,false,"",0);
     AllEnviron[17] = new Environ(1521,'U',5,RhonesU,7,true,"Muggers",0);
     AllEnviron[18] = new Environ(1522,'W',3,RhonesW,4,false,"Chlorofix",0);
     AllEnviron[19] = new Environ(1611,'W',6,RhonesW,8,true,"",0);
     AllEnviron[20] = new Environ(1621,'U',6,RhonesU,7,true,"",0);
     AllEnviron[21] = new Environ(1622,'S',2,RhonesS,2,false,"",0);
     AllEnviron[22] = new Environ(1623,'W',3,RhonesW,3,false,"",0);
     AllEnviron[23] = new Environ(1631,'W',5,SauriansW,7,true,"Rotrons",0);
     AllEnviron[24] = new Environ(2111,'A',3,YestersA,5,true,"Derigions",0);
     AllEnviron[25] = new Environ(2121,'U',3,Ultraks,8,false,"",0);
     AllEnviron[26] = new Environ(2122,'W',3,KaynsW,4,false,"Margons",0);
     AllEnviron[27] = new Environ(2211,'W',4,SauriansW,6,true,"Snow Giants",0);
     AllEnviron[28] = new Environ(2221,'U',6,YestersU,9,true,"Laboroids",3);
     AllEnviron[29] = new Environ(2231,'A',5,YestersA,7,true,"Drants",0);
     AllEnviron[30] = new Environ(2232,'W',3,Charkhans,5,true,"",0);
     AllEnviron[31] = new Environ(2311,'U',3,RhonesU,6,true,"Propangs",0);
     AllEnviron[32] = new Environ(2312,'A',3,YestersA,5,true,"",0);
     AllEnviron[33] = new Environ(2321,'U',4,Environ2321,7,true,"Drusers",0);
     AllEnviron[34] = new Environ(2322,'S',2,PioradsS,2,false,"",0);
     AllEnviron[35] = new Environ(2323,'W',3,Ursi,3,true,"Batranobans",0);
     AllEnviron[36] = new Environ(2411,'L',3,SuvansL,3,false,"Gilekites",1);
     AllEnviron[37] = new Environ(2412,'W',5,RhonesW,7,true,"Sandiabs",0);
     AllEnviron[38] = new Environ(3111,'U',3,RhonesU,5,false,"Namdasns",0);
     AllEnviron[39] = new Environ(3112,'W',4,Mowevs,1,false,"",0);
     AllEnviron[40] = new Environ(3121,'A',4,YestersA,6,true,"Verfusiers",0);
     AllEnviron[41] = new Environ(3122,'W',5,Kirts,5,false,"Graggs",0);
     AllEnviron[42] = new Environ(3211,'U',3,SauriansU,6,true,"Alweg",0);
     AllEnviron[43] = new Environ(3221,'S',3,Calmas,5,true,"Arags",0);
     AllEnviron[44] = new Environ(3222,'W',4,Moghas,2,false,"Chantenes",0);
     AllEnviron[45] = new Environ(3231,'U',5,RhonesU,8,true,"",0);
     AllEnviron[46] = new Environ(3232,'W',4,RhonesW,6,true,"Queemers",0);
     AllEnviron[47] = new Environ(3311,'U',4,SauriansU,7,true,"",3);
     AllEnviron[48] = new Environ(3411,'L',3,SuvansL,3,false,"Morna",2);
     AllEnviron[49] = new Environ(3412,'W',4,Deaxins,2,false,"Vrialta",0);
     AllEnviron[50] = new Environ(3421,'U',2,Environ3421,4,false,"Synestins",0);
     AllEnviron[51] = new Environ(3422,'L',3,SuvansL,3,false,"",0);
     AllEnviron[52] = new Environ(3423,'S',4,Rylians,6,false,"Elliad",0);
     AllEnviron[53] = new Environ(3511,'L',3,SuvansL,3,false,"Gyrogos",0);
     AllEnviron[54] = new Environ(3521,'U',3,SauriansU,4,false,"Leonus",0);
     AllEnviron[55] = new Environ(4111,'U',6,RhonesU,8,true,"Sekekers",0);
     AllEnviron[56] = new Environ(4121,'L',5,Phans,7,true,"Virus",0);
     AllEnviron[57] = new Environ(4122,'W',5,Leonids,7,false,"",0);
     AllEnviron[58] = new Environ(4211,'U',3,Environ4211,8,true,"",1);
     AllEnviron[59] = new Environ(4212,'W',4,RhonesW,6,true,"Frost Mist",0);
     AllEnviron[60] = new Environ(4311,'L',6,Henones,10,true,"Snorkas",0);
     AllEnviron[61] = new Environ(4321,'U',4,Susperans,7,false,"Telebots",2);
     AllEnviron[62] = new Environ(4322,'S',3,PioradsS,3,false,"",0);
     AllEnviron[63] = new Environ(4323,'W',5,Thoks,3,false,"Gadhars",0);
     AllEnviron[64] = new Environ(4331,'S',4,PioradsS,4,false,"Kinsogs",0);
     AllEnviron[65] = new Environ(4332,'W',3,Illias,5,true,"",0);
     AllEnviron[66] = new Environ(4411,'W',3,Theshians,7,true,"Thunks",9);
     AllEnviron[67] = new Environ(4421,'U',3,PioradsU,4,false,"",0);
     AllEnviron[68] = new Environ(4422,'S',4,PioradsS,4,false,"Gamels",0);
     AllEnviron[69] = new Environ(4511,'S',4,PioradsS,4,false,"Spithids",0);
     AllEnviron[70] = new Environ(5111,'U',5,Jopers,10,false,"Hysnatons",0);
     AllEnviron[71] = new Environ(5121,'W',5,Ardorats,7,false,"Gachs",1);
     AllEnviron[72] = new Environ(5131,'U',3,Ornotins,6,false,"",0);
     AllEnviron[73] = new Environ(5132,'F',5,Xanthons,4,false,"Mish",0);
     AllEnviron[74] = new Environ(5211,'U',4,SegundensU,9,true,"Chardireeds",0);
     AllEnviron[75] = new Environ(5221,'F',4,Xanthons,3,false,"Onflams",0);
     AllEnviron[76] = new Environ(5231,'S',2,RhonesS,4,false,"",2);
     AllEnviron[77] = new Environ(5232,'W',3,RhonesW,5,true,"Thinagigs",0);
     AllEnviron[78] = new Environ(5311,'F',4,Xanthons,3,false,"",0);
     AllEnviron[79] = new Environ(5411,'A',4,Cavalkus,8,true,"Fog",0);
     AllEnviron[80] = new Environ(5421,'U',4,RhonesU,6,true,"Valaterix",0);
     AllEnviron[81] = new Environ(5422,'W',3,RhonesW,4,false,"",0);
     AllEnviron[82] = new Environ(5511,'W',4,KaynsW,5,true,"Wyths",0);
 }

    //Code for search()
    public static void search(int PlayerTurn, Vector planetVector)
    {
	StarSystem SearchSystem;
	Vector SearchIn=new Vector();
	Planet SPlanet;
	Environ SEnviron;
	boolean cansearch=false;
	boolean calledGui=false;
	
	System.out.println("Entering Search() in Environ");
	
	SearchSystem=((Planet)planetVector.elementAt(0)).getSystem();	
	//if search turn is Rebel Search turn
	if(PlayerTurn==2){
	    for(int x=0;x<planetVector.size();x++){
		SPlanet=(Planet)planetVector.elementAt(x);
		for(int w=0;w<SPlanet.getNumEnvirons();w++){
		    SEnviron=(Environ)SPlanet.getEnvirons().elementAt(w);
		    for(int i=0;i<SEnviron.getNumImperialCharUnits();i++)
			if(((Charactr)SEnviron.getImperialCharGroup().getGroup().elementAt(i)).getIsDetected()) cansearch=true;
		    if(cansearch) SearchIn.add(SPlanet.getEnvirons().elementAt(w));
		    cansearch=false;
		}
		if(SearchSystem != ((Planet)planetVector.elementAt(x)).getSystem()){ 
		    SearchGui.myGui(SearchSystem);
		    SearchSystem=((Planet)planetVector.elementAt(x)).getSystem();
		    calledGui=true;
		    if(x==planetVector.size()-1) SearchGui.myGui(SearchSystem);
		}
		else if(x==planetVector.size()-1) {
		    SearchGui.myGui(SearchSystem);
		    calledGui=true;
		}
	    }	
	}
	
	
	
	else{
	    //if search turn is Imperial Search Turn 
	    for(int x=0;x<planetVector.size();x++){
		SPlanet=(Planet)planetVector.elementAt(x);
		for(int w=0;w<SPlanet.getNumEnvirons();w++){
		    SEnviron=(Environ)SPlanet.getEnvirons().elementAt(w);
		    for(int i=0;i<SEnviron.getNumRebelCharUnits();i++)
			if(((Charactr)SEnviron.getRebelCharGroup().getGroup().elementAt(i)).getIsDetected()) cansearch=true;
		    if(cansearch) SearchIn.add(SPlanet.getEnvirons().elementAt(w));
		    cansearch=false;
		}    
	       
	    }
	}
	System.out.println("Nothing getting called");
	if(!calledGui) Game.setDone();
    }
    
    //Code for search() during a mission
    public static void search(int PlayerTurn, Environ SEnviron)
    {
	boolean cansearch=false;
	Group found=new Group();
	
	
	//if Mission Search is With Rebel characters
	if(PlayerTurn==2){
	    for(int i=0;i<SEnviron.getNumImperialCharUnits();i++)
		if(((Charactr)SEnviron.getImperialCharGroup().getGroup().elementAt(i)).getIsDetected()) cansearch=true;
	    if(cansearch=true) 	  
		found=MTSearchTable.searchWith(SEnviron.ConvertImperialCharGroup());
	    // if(found.getNumUnits()!=0) ;//call combat	
	    String myString=new String(); 
	    if(found.getNumUnits()!=0){
	for(int i=0;i<found.getNumUnits();i++)
		    myString=myString+((Charactr)found.getGroup().elementAt(i)).getCharName()+'\n';
	  JOptionPane.showMessageDialog(null,"Characters Found\n"+myString);
	  // new SearchGui(foo).show();
	  }
	  else 
	      JOptionPane.showMessageDialog(null,"No Characters Found");
	}
	
	
	
	else{
	    //if Mission Search is With Imperial characters 
	    for(int i=0;i<SEnviron.getNumRebelCharUnits();i++)
		if(((Charactr)SEnviron.getRebelCharGroup().getGroup().elementAt(i)).getIsDetected()) cansearch=true;
	    if(cansearch=true) 	  
		found=MTSearchTable.searchWith(SEnviron.ConvertRebelCharGroup());
	    //    if(found.getNumUnits()!=0) ;//call combat	
	    //else no characters found
	    String myString=new String();
	    if(found.getNumUnits()!=0){
		for(int i=0;i<found.getNumUnits();i++)
		    myString=myString+((Charactr)found.getGroup().elementAt(i)).getCharName()+'\n';
		JOptionPane.showMessageDialog(null,"Characters Found\n"+myString);
		// new SearchGui(foo).show();
	    }
	    else 
		JOptionPane.showMessageDialog(null,"No Characters Found");
	}
    }

    //Second Code for search() during a mission
    public static void search(int PlayerTurn, CharacterGroup SearchGroup)
    {
	boolean cansearch=false;
	Group found=new Group();
	
	
	//if Mission Search is With Rebel characters
	if(PlayerTurn==2){
	    found=MTSearchTable.searchWith(SearchGroup.getEnviron().ConvertImperialCharGroup(),SearchGroup);
	    String myString=new String(); 
	    if(found.getNumUnits()!=0){
		for(int i=0;i<found.getNumUnits();i++)
		    myString=myString+((Charactr)found.getGroup().elementAt(i)).getCharName()+'\n';
		JOptionPane.showMessageDialog(null,"Characters Found\n"+myString);
		// new SearchGui(foo).show();
	    }
	    else 
		JOptionPane.showMessageDialog(null,"No Characters Found");
	}
	
	
	
	else{
	    found=MTSearchTable.searchWith(SearchGroup.getEnviron().ConvertRebelCharGroup(),SearchGroup);
	    String myString=new String(); 
	    if(found.getNumUnits()!=0){
		for(int i=0;i<found.getNumUnits();i++)
		    myString=myString+((Charactr)found.getGroup().elementAt(i)).getCharName()+'\n';
		JOptionPane.showMessageDialog(null,"Characters Found\n"+myString);
		// new SearchGui(foo).show();
	    }
	    else 
		JOptionPane.showMessageDialog(null,"No Characters Found");   
	}
    }
    
    
    /**
     *hasMissionChars()
     *decides whether the environ has characters on it on the selected side
     */
    public boolean hasMissionChars(int side)
    {
        switch(side)
        {
            case 0:
                if(imperialCharGroup.getGroup().isEmpty())
                    return false;
                break;
            case 1:
                if(rebelCharGroup.getGroup().isEmpty())
                    return false;
                break;
            default:
                return false;
        }
        return true;
    }
}
