package logwriter;

import java.io.*;
import com.google.protobuf.*;

import config.ConfigFile;
import network.message.*;
import network.message.protobuf.RemoteMessageFromRobot.*;
import network.message.ssl.*;
import network.message.ssl.RobotMessage.*;

public class SSLLogWriter implements MessageFromRobotListener, MessageFromSSLListener {

  public SSLLogWriter(String filename) {
    this.filename = filename;
    this.currentTimeStamp = 0;
    file = null;
  }
  
  @Override
  public void receiveRemoteMessageFromRobot(RemoteMessageFromRobot message) {
    if (message.getType() != RemoteMessageFromRobot.MessageType.PROTOBUF) {
      return;
    }
    
    try {
      RemoteMessageFromRobotProtobuf protobuf = RemoteMessageFromRobotProtobuf.parseFrom(message.getData());
      if (protobuf.hasTimestamp()) {
        currentTimeStamp = (int)protobuf.getTimestamp();
      }
      else if (protobuf.hasRobotStateProtobuf() && protobuf.getRobotStateProtobuf().hasTimestamp()) {
        currentTimeStamp = (int)protobuf.getRobotStateProtobuf().getTimestamp();
      }
    }
    catch (InvalidProtocolBufferException e) {
    }

  }

  @Override
  public void receiveSSLMessage(SSLMessage sslMessage) {
    if (sslMessage instanceof BallMessage) {      
      BallMessage ballMessage = (BallMessage)sslMessage;
      
      try {
        if (file == null) {
          file = new FileWriter(filename);
        }
        file.write(currentTimeStamp + separator
                   + "TYPE=BALL" + separator
                   + "X="+ ballMessage.getX() + separator
                   + "Y="+ ballMessage.getY()+ separator
                   + "Conf="+ ballMessage.getConfidence() 
                   + System.getProperty("line.separator") );
        file.flush();
      }
      catch (IOException e) {
        System.err.println("Error occurred while writing to output file: " + filename);
      }
    }
    else if (sslMessage instanceof RobotMessage) {
      RobotMessage robotMessage = (RobotMessage)sslMessage;
      
      try {
        if (file == null) {
          file = new FileWriter(filename);
        }
        file.write(currentTimeStamp + separator
                   + (robotMessage.getColor() == RobotColor.blue ? 
                       "TYPE=BLUE" + separator
                      :"TYPE=YELLOW" + separator)
                   + "X="+ robotMessage.getX() + separator
                   + "Y="+ robotMessage.getY()+ separator
                   + "Conf="+ robotMessage.getConfidence() 
                   + System.getProperty("line.separator") );
        file.flush();
      }
      catch (IOException e) {
        System.err.println("Error occurred while writing to output file: " + filename);
      }         
    }
   
  }

  public static SSLLogWriter create(ConfigFile configFile) {
    try {
      boolean enabled = configFile.getBool("logToFile/sslLogEnabled", false);
      if (!enabled) {
        return null;
      }
      
      String filename = configFile.getPath("logToFile/sslLog", "sslLog.log");
      return new SSLLogWriter(filename);
    }
    catch (Exception e) {
      return null;
    }
  }
  
  private String filename;
  private FileWriter file;
  private int currentTimeStamp;
  private final String separator = " ";
  
}
