package logwriter;

import java.io.*;
import com.google.protobuf.*;

import config.*;
import network.message.*;
import network.message.protobuf.RemoteMessageFromRobot.*;
import network.message.protobuf.RobotState.*;

public class LogWriter implements MessageFromRobotListener {

  public LogWriter(String filename) {
    this.filename = filename;
    
    file = null;
    originalImage = null;
  }
  
  public void receiveRemoteMessageFromRobot(RemoteMessageFromRobot message) {
    if (message.getType() == RemoteMessageFromRobot.MessageType.ORIGINAL_IMAGE) {
      originalImage = message.getData();
    }
    if (message.getType() == RemoteMessageFromRobot.MessageType.PROTOBUF) {
      try {
        RemoteMessageFromRobotProtobuf protobuf = RemoteMessageFromRobotProtobuf.parseFrom(message.getData());
        if (!protobuf.hasRobotStateProtobuf()) {
          return;
        }
        
        RobotStateProtobuf robotStateProtobuf = protobuf.getRobotStateProtobuf();
        byte [] robotStateData = robotStateProtobuf.toByteArray();
        
        try {
          if (file == null) {
            file = new FileOutputStream(filename);
          }
          // Write the image
          file.write(originalImage);
          
          // Write the size of the robot state protobuf
          byte [] size = new byte[4];
          size[0] = (byte)((robotStateData.length >> 24) & 0xFF);
          size[1] = (byte)((robotStateData.length >> 16) & 0xFF);
          size[2] = (byte)((robotStateData.length >> 8) & 0xFF);
          size[3] = (byte)( robotStateData.length       & 0xFF);
          file.write(size);
          
          // Write the robot state protobuf
          file.write(robotStateData);
          
          // Flush the file
          file.flush();
        }
        catch (IOException e) {
          System.err.println("Error occurred while writing to output file: " + filename);
        }
      }
      catch (InvalidProtocolBufferException e) {
      }
      
    }
  }
  
  public static LogWriter create(ConfigFile configFile) {
    try {
      boolean enabled = configFile.getBool("logToFile/enabled", false);
      if (!enabled) {
        return null;
      }
      
      String filename = configFile.getPath("logToFile/filename", "log.log");
      return new LogWriter(filename);
    }
    catch (Exception e) {
      return null;
    }
  }

  private String filename;
  private FileOutputStream file;
  
  private byte [] originalImage;
}
