// Hier user_id durch eure userID ersetzen
package aufgaben.seyrich;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

/** Dieses Servlet implementiert ein MasterMind spiel. Die Codes sind
    fünfstellig und enthalten Ziffern 0-9.
*/
public class mmServlet extends HttpServlet {
    
    /** Kommuniziert mit dem Applet. */
    public void doGet(HttpServletRequest request, 
		      HttpServletResponse response)
    throws ServletException, IOException
    {
	HttpSession session; // Das Session Objekt
	String theCode,      // String für den Code
	    aCode;           // String für den Code-Kandidaten
	int tryNum;          // Anzahl der gemachten Versuche


	// ---------- Hier beginnt Eure Aufgabe ----------------------------
	System.err.println("seyrich=============================\n");
	// FALLS Parameter "action" den Wert "code" hat...
	//  1. Erzeuge eine Session falls noch keine vorhanden
	//  2. Erzeuge einen neuen code
	//  3. Setze Anzahl der Versuche auf 0
	if(request.getParameter("action").equals("code")){
	    System.err.println("seyrich init");
	    System.err.println("seyrich hole code");
	    // Neue session erstellen oder alte weiterbenutzen
	    // Hole Session ohne eine zu erstellen
	   
	    // Falls sie "null" ist erzeuge eine neue
	    if((session = request.getSession(false))==null){
		session = request.getSession(true);
	    }
	    if(session==null){
		System.err.println("seyrich NULL");
	    }
	    System.err.println("seyrich habe session");
	    //schöner wäre
	    //request.getSession();
	    //die macht nur eine, wenn keine da ist, liefer sie sonst zurück

	    // Neuen code erstellen (mit createCode())
	    theCode=createCode();
	    System.err.println("seyrich habe code");
	    // Den code in die Session schreiben
	   
	    System.err.println("seyrich Valunames");
	    // String[] s = session.getValueNames();
	    //for(int i=0;i<s.length;i++)
	    //System.err.println("seyrich"+ s[i]);
	    System.err.println("seyrich putte: "+theCode);
	    session.putValue("theCode",theCode);
	    System.err.println("seyrich code reingeputtet");
	    // Die Anzahl der Versuche auf 0 setzen und in die Session schreiben
	    tryNum = 0;
	    System.err.println("seyrich habe num");
      	    session.putValue("tryNum",new Integer(tryNum));
	    System.err.println("seyrich habe num geputtet: "+tryNum);
	    String[] s = session.getValueNames();
	    for(int i=0;i<s.length;i++)
		System.err.println("\nseyrich "+ s[i]);
	}

	// SONST FALLS Parameter "action" der Wert "validate" hat...
	//  - Vergleiche CodeKandidaten mit dem Code
	//  - Erhöhe Anzahl der Versuche
	//  - Liefer Ergebniss an Applet zurück
	else if(request.getParameter("action").equals("validate")){
	    System.err.println("seyrich check");
	    // Hole session
	    session = request.getSession(false);
	   
	    if(session==null){
		System.err.println("seyrich NULL");
		session = request.getSession(true);
	    }
	    System.err.println("seyrich habe session");
	    // Hole den Code aus der Session
	    theCode="theo";
	    theCode = (String)session.getValue("theCode");
	    System.err.println("seyrich habe theCode: "+theCode);
	    // Hole den Code-Kanditaten aus der request (Parameter "code");
	    aCode = request.getParameter("code");
	    System.err.println("seyrich habe aCode: "+aCode);
	    // Falls Code-Kandidat==null tue nichts (return)
	    if(aCode==null){
		System.err.println("seyrich aCode NULL");
		return;
	    }
	   
	    String[] s = session.getValueNames();
	    System.err.println("seyrich getValuNames():");
	    for(int i=0;i<s.length;i++)
	    System.err.println("\tseyrich "+ s[i]);
	    // Hole Anzahl der Versuche aus Session (typecast notwendig)
	    tryNum = ((Integer) session.getValue("tryNum")).intValue();
	    System.err.println("seyrich habe tryNum: "+tryNum);
	    // Erhöhe Anzahl der Versuche und schreibe sie in die Session
	    tryNum++;
	    session.putValue("tryNum",new Integer(tryNum));
	    System.err.println("seyrich habe trynum puttet: "+tryNum);
	    // ContentType auf "text/plain" setzen
	    response.setContentType("text/html");
	    // PrintWriter aus response holen.
	    PrintWriter out = response.getWriter();
	    // Antwort in PrintWriter Schreiben. 
	    // Format ist: "<Anzahl_der_Versuche>,"+validateCode(derCode, CodeKandidat)
	    System.err.println("seyrich rechnen");
	    out.println(tryNum+","+validateCode(theCode,aCode));
	    out.close();
	    System.err.println("seyrich fertig");
	}
	// --------------------- Hier endet Eure Aufgabe -----------------------

	// Sonst...
	else
	    response.setStatus(response.SC_NO_CONTENT);
    }

    /** Ruft doGet auf. */
    public synchronized void doPost(HttpServletRequest request,
				   HttpServletResponse response)
    throws ServletException, IOException
    {
	doGet(request, response);
    }

    /** Erzeugt einen neuen fünfstelligen Code. */
    private String createCode() { 
	String newCode = "";
	while (newCode.length() != 5)
	    newCode = String.valueOf(Math.round(Math.random()*100000));

	return newCode;
    }

    /** Vergleicht den Code mit dem Code-Kandidaten und gibt das Ergebniss zurück
	@param theCode   Der Code. Fünfstelliger String mit Zahlen
	@param aCode     Der Code-Kandidat. Fünfstelliger String mit Zahlen.
	@return          Ein String "<Zahl1>,<Zahl2>". 
                         Zahl1: Ziffern an richtiger Position.
			 Zahl2: Ziffern im Code enthalten aber an falscher Stelle.

    */
    private String validateCode(String theCode, String aCode) {
	char[] codeVec = new char[theCode.length()];
	char[] tryVec = new char[aCode.length()];
	int i, k;
	int ok_pos = 0;
	int ok_in  = 0;
	
	for (i=0; i<theCode.length(); i++)
	    codeVec[i] = theCode.charAt(i);
	for (i=0; i<aCode.length(); i++)
	    tryVec[i] = aCode.charAt(i);

	
	for (i=0; i<aCode.length(); i++) {
	    char c = tryVec[i];
	    if (c == codeVec[i]) {
		++ok_pos;
		codeVec[i]='x';
	    }
	}

	for (i=0; i<aCode.length(); i++) {
	    char c = tryVec[i]; 
	    for (k=0; k<theCode.length(); k++) {
		if (k == i) continue;

		if (c == codeVec[k]) {
		    ++ok_in;
		    codeVec[k]='X';
		    break;
		}
	    }
	}
	return ok_pos+","+ok_in;
    }

}
