#include <esp32cam.h>
#include <WebServer.h>
#include <WiFi.h>

#define AP_SSID "hello"
#define AP_PASS "bruh"

WebServer server(80);

void handleStream() {
  WiFiClient client = server.client();
  const char* header = "HTTP/1.1 200 OK\r\n"
                       "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n";
  client.print(header);

  while (client.connected()) {
    auto img = esp32cam::capture();
    if (img == nullptr) {
      client.stop();
      return;
    }

    client.print("--frame\r\n");
    client.print("Content-Type: image/jpeg\r\n");
    client.print("Content-Length: " + String(img->size()) + "\r\n\r\n");
    img->writeTo(client);
    client.print("\r\n");

    img.reset();
    delay(50);  // Adjust the delay for the desired frame rate
  }
}

void setup() {
  Serial.begin(115200);

  WiFi.softAP(AP_SSID, AP_PASS);
  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);

  auto res = esp32cam::Resolution::find(1024, 768);  // Lower resolution for more stable stream
  esp32cam::Config cfg;
  cfg.setPins(esp32cam::pins::AiThinker);
  cfg.setResolution(res);
  cfg.setJpeg(80);
  bool ok = esp32cam::Camera.begin(cfg);
  if (!ok) {
    Serial.println("Camera init failed");
    return;
  }

  server.on("/stream", handleStream);
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}
