#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include "handshake.cpp" //handshaking
#include "chunkstream.cpp" //chunkstream decoding
#include "amf.cpp" //simple AMF0 parsing

int main(){
  doHandshake();

  chunkpack next;
  std::vector<AMFType> * amfdata = 0;
  while (!feof(stdin)){
    next = getWholeChunk();
    if (next.cs_id == 2 && next.msg_stream_id == 0){
      fprintf(stderr, "Received protocol message. (cs_id 2, stream id 0)\nContents:\n");
      fwrite(next.data, 1, next.real_len, stderr);
      fflush(stderr);
    }
    switch (next.msg_type_id){
      case 1:
        fprintf(stderr, "CTRL: Set chunk size\n");
        break;
      case 2:
        fprintf(stderr, "CTRL: Abort message\n");
        break;
      case 3:
        fprintf(stderr, "CTRL: Acknowledgement\n");
        break;
      case 4:
        fprintf(stderr, "CTRL: User control message\n");
        break;
      case 5:
        fprintf(stderr, "CTRL: Window size\n");
        break;
      case 6:
        fprintf(stderr, "CTRL: Set peer bandwidth\n");
        break;
      case 8:
        fprintf(stderr, "Received audio data\n");
        break;
      case 9:
        fprintf(stderr, "Received video data\n");
        break;
      case 15:
        fprintf(stderr, "Received AFM3 data message\n");
        break;
      case 16:
        fprintf(stderr, "Received AFM3 shared object\n");
        break;
      case 17:
        fprintf(stderr, "Received AFM3 command message\n");
        break;
      case 18:
        fprintf(stderr, "Received AFM0 data message\n");
        break;
      case 19:
        fprintf(stderr, "Received AFM0 shared object\n");
        break;
      case 20:
        fprintf(stderr, "Received AFM0 command message\n");
        if (amfdata != 0){delete amfdata;}
        amfdata = parseAMF(next.data, next.real_len);
        
        break;
      case 22:
        fprintf(stderr, "Received aggregate message\n");
        break;
      default:
        fprintf(stderr, "Unknown chunk received!\n");
        break;
    }
  }

  
  return 0;
}//main