#include <WiFi.h>
#include <WebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>


const char* ssid = "********";
const char* password = "&&&&&&&&";

#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 16, 2);
WebServer server(80);
float temperatureC = 0;

String getCondition(float temp)
{
  if(temp >= 36.1 && temp <= 37.2)
    return "Human Body Temperature";

  else if(temp >= 20 && temp <= 26)
    return "Ideal Room Temperature";

  else if(temp >= 10 && temp <= 25)
    return "Drinking Water Range";

  else if(temp >= 1 && temp <= 5)
    return "Cold Drink Temperature";

  else if(temp >= 1 && temp <= 4)
    return "Milk Storage Range";

  else if(temp >= 2 && temp <= 5)
    return "Refrigerator Temperature";

  else if(temp >= 22 && temp <= 28)
    return "Fish Tank Temperature";

  else if(temp >= 18 && temp <= 24)
    return "Baby Room Temperature";

  else if(temp >= 18 && temp <= 30)
    return "Greenhouse Temperature";

  else if(temp >= 18 && temp <= 27)
    return "Computer Room Temperature";

  return "General Temperature";
}


// Web Page

String webpage()
{
  String condition = getCondition(temperatureC);

  String page;

  page += "<!DOCTYPE html>";
  page += "<html>";
  page += "<head>";

  page += "<meta charset='UTF-8'>";
  page += "<meta name='viewport' content='width=device-width, initial-scale=1'>";
  page += "<meta http-equiv='refresh' content='3'>";

  page += "<title>Smart Thermometer</title>";

  page += "<style>";

  page += "body{font-family:Arial;background:#f2f2f2;text-align:center;padding:10px;}";

  page += ".card{background:white;padding:20px;margin:auto;max-width:700px;";
  page += "border-radius:15px;";
  page += "box-shadow:0 0 15px rgba(0,0,0,0.2);}";

  page += ".temp{font-size:55px;color:#ff5722;font-weight:bold;}";

  page += ".analysis{background:#e8f5e9;padding:10px;margin-top:15px;";
  page += "border-radius:10px;font-size:22px;}";

  page += "table{width:100%;border-collapse:collapse;margin-top:15px;}";

  page += "th,td{border:1px solid #ddd;padding:10px;}";

  page += "th{background:#2196F3;color:white;}";

  page += "tr:nth-child(even){background:#f9f9f9;}";

  page += "</style>";

  page += "</head>";
  page += "<body>";

  page += "<div class='card'>";

  page += "<h1>🌡 Smart Thermometer</h1>";

  page += "<div class='temp'>";
  page += String(temperatureC,1);
  page += " &deg;C";
  page += "</div>";

  page += "<h3>ESP32 IP</h3>";
  page += "<p>";
  page += WiFi.localIP().toString();
  page += "</p>";

  page += "<div class='analysis'>";
  page += "<b>Current Analysis:</b><br>";
  page += condition;
  page += "</div>";

  page += "<h2>Daily Temperature Reference</h2>";

  page += "<table>";

  page += "<tr>";
  page += "<th>Item</th>";
  page += "<th>Minimum</th>";
  page += "<th>Maximum</th>";
  page += "</tr>";

  page += "<tr><td>Human Body</td><td>36.1°C</td><td>37.2°C</td></tr>";
  page += "<tr><td>Room Temperature</td><td>20°C</td><td>26°C</td></tr>";
  page += "<tr><td>Drinking Water</td><td>10°C</td><td>25°C</td></tr>";
  page += "<tr><td>Cold Drink</td><td>1°C</td><td>5°C</td></tr>";
  page += "<tr><td>Milk Storage</td><td>1°C</td><td>4°C</td></tr>";
  page += "<tr><td>Refrigerator</td><td>2°C</td><td>5°C</td></tr>";
  page += "<tr><td>Freezer</td><td>-18°C</td><td>-15°C</td></tr>";
  page += "<tr><td>Baby Room</td><td>20°C</td><td>24°C</td></tr>";
  page += "<tr><td>Fish Tank</td><td>22°C</td><td>28°C</td></tr>";
  page += "<tr><td>Greenhouse</td><td>18°C</td><td>30°C</td></tr>";
  page += "<tr><td>Computer Room</td><td>18°C</td><td>27°C</td></tr>";
  page += "<tr><td>Server Room</td><td>18°C</td><td>24°C</td></tr>";

  page += "</table>";

  page += "<br><h3>Made with ESP32 + DS18B20 + LCD</h3>";

  page += "</div>";
  page += "</body>";
  page += "</html>";

  return page;
}


void handleRoot()
{
  server.send(200, "text/html", webpage());
}


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

  Wire.begin(21,22);

  lcd.init();
  lcd.backlight();

  lcd.setCursor(0,0);
  lcd.print("Smart Thermo");

  lcd.setCursor(0,1);
  lcd.print("Starting...");

  sensors.begin();

  WiFi.begin(ssid, password);

  lcd.clear();
  lcd.print("Connecting WiFi");

  while(WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.println("Connected");
  Serial.println(WiFi.localIP());

  lcd.clear();

  lcd.setCursor(0,0);
  lcd.print("WiFi Connected");

  lcd.setCursor(0,1);
  lcd.print(WiFi.localIP());

  server.on("/", handleRoot);
  server.begin();

  delay(3000);
}


void loop()
{
  server.handleClient();

  sensors.requestTemperatures();

  temperatureC = sensors.getTempCByIndex(0);

  if(temperatureC == DEVICE_DISCONNECTED_C)
  {
    lcd.setCursor(0,0);
    lcd.print("Sensor Error   ");

    lcd.setCursor(0,1);
    lcd.print("Check Wiring   ");

    delay(1000);
    return;
  }

  Serial.print("Temperature: ");
  Serial.println(temperatureC);

  lcd.setCursor(0,0);
  lcd.print("Temp:");
  lcd.print(temperatureC,1);
  lcd.print((char)223);
  lcd.print("C   ");

  lcd.setCursor(0,1);
  lcd.print("IP:");
  lcd.print(WiFi.localIP());
  lcd.print(" ");

  delay(2000);
}