#include "vision/BinaryServer.h"

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <errno.h>
#include <string.h>
#include <vector>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>

#include "aos/externals/libjpeg/include/jpeglib.h"
#include "aos/linux_code/camera/Buffers.h"
#include "aos/common/time.h"

namespace frc971 {
namespace vision {

static void echo_read_cb(struct bufferevent *bev, void * /*ctx*/) {
  struct evbuffer *input = bufferevent_get_input(bev);
  struct evbuffer *output = bufferevent_get_output(bev);

  size_t len = evbuffer_get_length(input);
  char *data;
  data = (char *)malloc(len);
  evbuffer_copyout(input, data, len);

  printf("we got some data: %s\n", data);

  evbuffer_add_buffer(output, input);
}

void BinaryServer::ErrorEvent(struct bufferevent *bev, short events) {
  if (events & BEV_EVENT_ERROR) perror("Error from bufferevent");
  if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) {
    have_id = false;
    bufferevent_free(bev);
  }
}

void BinaryServer::Accept(struct evconnlistener *listener, evutil_socket_t fd,
                          struct sockaddr * /*address*/, int /*socklen*/) {
  struct event_base *base = evconnlistener_get_base(listener);
  if (!have_id) {
    struct bufferevent *bev =
        bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
    _output = bufferevent_get_output(bev);
    _bufev = bev;
    have_id = true;
    int no_delay_flag = 1;
    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &no_delay_flag,
               sizeof(no_delay_flag));

    bufferevent_setcb(bev, echo_read_cb, NULL, StaticErrorEvent, this);

    bufferevent_enable(bev, EV_READ | EV_WRITE);
  }
}
static void accept_error_cb(struct evconnlistener *listener, void * /*ctx*/) {
  struct event_base *base = evconnlistener_get_base(listener);
  int err = EVUTIL_SOCKET_ERROR();
  fprintf(stderr, "Got an error %d (%s) on the listener. "
                  "Shutting down.\n",
          err, evutil_socket_error_to_string(err));

  event_base_loopexit(base, NULL);
}

void BinaryServer::StartServer(uint16_t port) {
  _fd = socket(AF_INET, SOCK_STREAM, 0);
  struct sockaddr_in sin;
  memset(&sin, 0, sizeof(sin));
  sin.sin_family = AF_INET;
  sin.sin_port = htons(port);
  sin.sin_addr.s_addr = inet_addr("0.0.0.0");

  listener = evconnlistener_new_bind(
      _base, StaticAccept, this, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1,
      (struct sockaddr *)(void *)&sin, sizeof(sin));

  if (!listener) {
    fprintf(stderr, "%s:%d: Couldn't create listener\n", __FILE__, __LINE__);
    exit(-1);
  }

  evconnlistener_set_error_cb(listener, accept_error_cb);
}

void BinaryServer::Notify(int fd, short /*what*/) {
  char notes[4096];
  int count = read(fd, notes, 4096);
  if (count == 0) {
    close(fd);
    fprintf(stderr, "%s:%d: Error No cheeze from OpenCV task!!!\n", __FILE__,
            __LINE__);
    exit(-1);
  }
  printf("notified!: %d\n", count);
  if (have_id) {
    printf("got someone to read my stuff!\n");
    char *binary_data;
    size_t len;
    if (_notify->GetData(&binary_data, &len)) {
      printf("here is for sending\n");
      evbuffer_add_reference(_output, binary_data, len,
                             PacketNotifier::StaticDataSent, _notify);
      printf("this is how sending went %d\n",
             bufferevent_flush(_bufev, EV_WRITE, BEV_FLUSH));
    }
  }
}

// Constructor
BinaryServer::BinaryServer(uint16_t port,
                           frc971::vision::PacketNotifier *notify)
    : _base(event_base_new()) {
  have_id = false;
  StartServer(port);
  _notify = notify;
  frame_notify = event_new(_base, notify->RecieverFD(), EV_READ | EV_PERSIST,
                           StaticNotify, this);
  event_add(frame_notify, NULL);
  event_base_dispatch(_base);
}

}  // namespace vision
}  // namespace frc971
