#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char* ssid     = "PipeCrawler";
const char* password = "crawl1234";

ESP8266WebServer server(80);

// Motor pins
#define MOT_IN1  D1
#define MOT_IN2  D2
#define MOT_EN   D3

// Drill pins
#define DRL_IN1  D5
#define DRL_IN2  D6
#define DRL_EN   D7

// Single ultrasonic — front only
#define F_TRIG   D8
#define F_ECHO   D4

bool drillOn = false;

float readDistance() {
  digitalWrite(F_TRIG, LOW);
  delayMicroseconds(4);
  digitalWrite(F_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(F_TRIG, LOW);
  long dur = pulseIn(F_ECHO, HIGH, 30000);
  if (dur == 0) return 999.0;
  return (dur * 0.0343) / 2.0;
}

void setDrive(int speed, bool fwd) {
  digitalWrite(MOT_IN1, fwd ? HIGH : LOW);
  digitalWrite(MOT_IN2, fwd ? LOW  : HIGH);
  analogWrite(MOT_EN, constrain(speed, 0, 1023));
}

void stopDrive() {
  analogWrite(MOT_EN, 0);
  digitalWrite(MOT_IN1, LOW);
  digitalWrite(MOT_IN2, LOW);
}

void setDrill(bool on) {
  drillOn = on;
  digitalWrite(DRL_IN1, on ? HIGH : LOW);
  digitalWrite(DRL_IN2, LOW);
  analogWrite(DRL_EN, on ? 800 : 0);
}

void handleForward()  { setDrive(900, true);  server.send(200, "text/plain", "fwd"); }
void handleBackward() { setDrive(900, false); server.send(200, "text/plain", "bwd"); }
void handleStop()     { stopDrive();           server.send(200, "text/plain", "stop"); }
void handleDrillOn()  { setDrill(true);        server.send(200, "text/plain", "drill_on"); }
void handleDrillOff() { setDrill(false);       server.send(200, "text/plain", "drill_off"); }

void handleSensors() {
  float f = readDistance();
  String json = "{\"front\":" + String(f, 1) +
                ",\"drill\":" + String(drillOn ? "true" : "false") + "}";
  server.send(200, "application/json", json);
}

void handleRoot() {
  String html = R"rawhtml(
<!DOCTYPE html><html><head>
<meta name='viewport' content='width=device-width,initial-scale=1'>
<title>PipeCrawler</title>
<style>
  *{box-sizing:border-box;margin:0;padding:0}
  body{font-family:monospace;background:#111;color:#eee;padding:20px;max-width:400px;margin:0 auto}
  h1{color:#5DCAA5;font-size:1.3rem;margin-bottom:2px}
  .sub{color:#555;font-size:0.7rem;margin-bottom:18px}
  .card{background:#1a1a1a;border:1px solid #2a2a2a;border-radius:10px;padding:14px;margin-bottom:12px}
  .lbl{font-size:0.62rem;letter-spacing:0.1em;text-transform:uppercase;color:#555;margin-bottom:10px}
  .grid2{display:grid;grid-template-columns:1fr 1fr;gap:7px}
  button{background:#1f1f1f;color:#ccc;border:1px solid #333;border-radius:7px;padding:13px 0;
         font-family:monospace;font-size:0.78rem;cursor:pointer;width:100%}
  button:active{opacity:0.7}
  .fwd{border-color:#5DCAA5;color:#5DCAA5}
  .bwd{border-color:#F09595;color:#F09595}
  .stp{border-color:#EF9F27;color:#EF9F27;grid-column:1/-1}
  .dron{border-color:#5DCAA5;color:#5DCAA5}
  .sensor-box{background:#111;border:1px solid #222;border-radius:8px;padding:12px;text-align:center}
  .sv{font-size:2rem;font-weight:600}
  .su{font-size:0.6rem;color:#444;margin-top:3px}
  .warn{color:#EF9F27} .crit{color:#E24B4A}
  .live{font-size:0.65rem;color:#555;text-align:center;margin-top:10px}
  .dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:#5DCAA5;margin-right:4px}
</style></head><body>
<h1>PipeCrawler</h1>
<div class='sub'>192.168.4.1</div>

<div class='card'>
  <div class='lbl'>Drive</div>
  <div class='grid2'>
    <button class='fwd' onclick="cmd('forward')">&#9650; Forward</button>
    <button class='bwd' onclick="cmd('backward')">&#9660; Backward</button>
    <button class='stp' onclick="cmd('stop')">&#9632; Stop</button>
  </div>
</div>

<div class='card'>
  <div class='lbl'>Drill</div>
  <div class='grid2'>
    <button class='dron' onclick="cmd('drillon')">&#9654; ON</button>
    <button onclick="cmd('drilloff')">&#9646; OFF</button>
  </div>
</div>

<div class='card'>
  <div class='lbl'>Front Distance</div>
  <div class='sensor-box'>
    <div class='sv' id='sv'>--</div>
    <div class='su'>cm</div>
  </div>
  <div class='live'><span class='dot' id='dot'></span><span id='lt'>connecting...</span></div>
</div>

<script>
function cmd(a){ fetch('/'+a).catch(()=>{}); }
function poll(){
  fetch('/sensors').then(r=>r.json()).then(d=>{
    let el=document.getElementById('sv');
    let v=d.front;
    el.textContent = v<999 ? v.toFixed(1) : '---';
    el.className='sv';
    if(v<10) el.classList.add('crit');
    else if(v<25) el.classList.add('warn');
    document.getElementById('lt').textContent='updated '+new Date().toLocaleTimeString();
    document.getElementById('dot').style.background='#5DCAA5';
  }).catch(()=>{
    document.getElementById('dot').style.background='#E24B4A';
    document.getElementById('lt').textContent='lost connection';
  });
}
poll(); setInterval(poll,1000);
</script>
</body></html>
)rawhtml";
  server.send(200, "text/html", html);
}

void setup() {
  Serial.begin(115200);
  int out[] = {MOT_IN1,MOT_IN2,MOT_EN,DRL_IN1,DRL_IN2,DRL_EN,F_TRIG};
  for(int p:out){pinMode(p,OUTPUT);digitalWrite(p,LOW);}
  pinMode(F_ECHO, INPUT);

  WiFi.softAP(ssid, password);
  Serial.println(WiFi.softAPIP());

  server.on("/",        handleRoot);
  server.on("/forward", handleForward);
  server.on("/backward",handleBackward);
  server.on("/stop",    handleStop);
  server.on("/drillon", handleDrillOn);
  server.on("/drilloff",handleDrillOff);
  server.on("/sensors", handleSensors);
  server.begin();
}

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