package no.divvun.Analyzer.Client;

import java.io.*;

import no.divvun.Analyzer.Communication.*;
import no.divvun.Analyzer.Objects.*;

/**
 * This class implements the DivvunBasicServices interface and provides client
 * applications a default implementation of the required functionality. For
 * documentation of the methods see the DivvunBasicServices interface class.
 * @author tomi
 */
public class DivvunBasicServicesImplementation 
	implements DivvunBasicServices {
	
	private DivvunServerConnectionSocket serverConnection;
	private DivvunRequestListener listener;
	
	private DivvunBasicServicesImplementation() {}
	
	public DivvunBasicServicesImplementation(DivvunRequestListener listener, String serverAddress, int serverPort)
		throws DivvunServerConnectionException 
	{
		this.listener = listener;
		serverConnection = new DivvunServerConnectionSocket();
		serverConnection.initialize(listener, serverAddress, serverPort);
	}
	
	public void initServer(Parameters parameters) {
		InitRequest request = new InitRequest();
		request.setParameters(parameters);
		serverConnection.sendRequest(request);
	}
	
	public Analysis getAnalysis(String word) {
		AnalyzeRequest request = new AnalyzeRequest();
		request.setWord(word);
		Response response = serverConnection.sendRequest(request);
		listener.requestCompleted(response);
		return response.getElementContainer().getAnalysis();
	}
	
	public Generation generateWordform (String word) {
		GenerateRequest request = new GenerateRequest();
		request.setWord(word);
		Response response = serverConnection.sendRequest(request);
		listener.requestCompleted(response);
		return response.getElementContainer().getGeneration();
	}
	
	public Paradigm getFullParadigm(String word, String POS) {
		ParadigmRequest request = new ParadigmRequest();
		request.setWord(word);
		request.setPOS(POS);
		Response response = serverConnection.sendRequest(request);
		listener.requestCompleted(response);
		return response.getElementContainer().getParadigm();
	}
	
	public String hyphenateWord(String word, String POS) {
		HyphenateRequest request = new HyphenateRequest();
		request.setWord(word);
		Response response = serverConnection.sendRequest(request);
		listener.requestCompleted(response);
		return response.getElementContainer().getHyphenation();
	}
	
	public void disconnect() throws IOException{
		serverConnection.closeConnection();
	}
	
	public Response sendRequest(Request request) {
		Response response = serverConnection.sendRequest(request);
		listener.requestCompleted(response);
		return response;
	}
}
