//this file is generated by program(drogon_ctl) automatically,don't modify it!
#include "map.h"
#include <drogon/utils/OStringStream.h>
#include <drogon/utils/Utilities.h>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <list>
#include <deque>
#include <queue>

#include <string>

using namespace drogon;
std::string map::genText(const DrTemplateData& map_view_data)
{
	drogon::OStringStream map_tmp_stream;
	std::string layoutName{""};
    auto role = map_view_data.get<std::string>("role");
	map_tmp_stream << "<!DOCTYPE html>\n";
	map_tmp_stream << "<html lang=\"en\">\n";
	map_tmp_stream << "<head>\n";
	map_tmp_stream << "  <meta charset=\"UTF-8\">\n";
	map_tmp_stream << "  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n";
	map_tmp_stream << "  <title>TRAKERVEH - Map</title>\n";
	map_tmp_stream << "  <link rel=\"stylesheet\" href=\"/lib/leaflet/leaflet.css\">\n";
	map_tmp_stream << "  <link rel=\"stylesheet\" href=\"/css/style.css\">\n";
	map_tmp_stream << "  <link rel=\"stylesheet\" href=\"/css/leaflet-dark.css\">\n";
	map_tmp_stream << "  <link rel=\"stylesheet\" href=\"/map/css/map.css\">\n";
	map_tmp_stream << "</head>\n";
	map_tmp_stream << "<body>\n";
map_tmp_stream<<"\n";
	map_tmp_stream << "  <div id=\"fullscreen-map\"></div>\n";
map_tmp_stream<<"\n";
	map_tmp_stream << "  <div class=\"header\">\n";
	map_tmp_stream << "    <div class=\"logo\">TRAKERVEH</div>\n";
	map_tmp_stream << "  </div>\n";
map_tmp_stream<<"\n";
	map_tmp_stream << "  <div class=\"menu-container\" id=\"menu-container\">\n";
	map_tmp_stream << "    <button class=\"menu-icon-btn\" id=\"burger-btn\">\n";
	map_tmp_stream << "      <svg class=\"menu-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n";
	map_tmp_stream << "        <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n";
	map_tmp_stream << "        <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n";
	map_tmp_stream << "        <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n";
	map_tmp_stream << "      </svg>\n";
	map_tmp_stream << "    </button>\n";
	map_tmp_stream << "    <div class=\"menu-items\">\n";
	map_tmp_stream << "      <button class=\"menu-btn\" onclick=\"location.href='/trackers'\">Trackers</button>\n";
	map_tmp_stream << "      ";
 if(role == "admin") { 
	map_tmp_stream << "      <button class=\"menu-btn\" onclick=\"location.href='/agents'\">Agents</button>\n";
	map_tmp_stream << "      ";
 } 
	map_tmp_stream << "      <button class=\"menu-btn\" onclick=\"location.href='/map'\">Map</button>\n";
	map_tmp_stream << "      <button class=\"menu-btn\" onclick=\"location.href='/logout'\">Logout</button>\n";
	map_tmp_stream << "    </div>\n";
	map_tmp_stream << "  </div>\n";
map_tmp_stream<<"\n";
	map_tmp_stream << "  <div class=\"footer-info\">\n";
	map_tmp_stream << "    <div class=\"time-row\">\n";
	map_tmp_stream << "      <div class=\"time\">04:42</div>\n";
	map_tmp_stream << "      <div class=\"am-pm\">pm</div>\n";
	map_tmp_stream << "      <div class=\"page-title\">Map</div>\n";
	map_tmp_stream << "    </div>\n";
	map_tmp_stream << "    <div class=\"user-name\">";
 map_tmp_stream << map_view_data.get<std::string>("userName"); 
	map_tmp_stream << "</div>\n";
	map_tmp_stream << "  </div>\n";
map_tmp_stream<<"\n";
	map_tmp_stream << "  <script src=\"/lib/leaflet/leaflet.js\"></script>\n";
	map_tmp_stream << "  <script src=\"/js/script.js\"></script>\n";
	map_tmp_stream << "  <script>\n";
	map_tmp_stream << "    document.addEventListener('DOMContentLoaded', () => {\n";
	map_tmp_stream << "      const map = L.map('fullscreen-map', {\n";
	map_tmp_stream << "        zoomControl: true,\n";
	map_tmp_stream << "        attributionControl: false\n";
	map_tmp_stream << "      }).setView([47.3769, 8.5417], 12);\n";
map_tmp_stream<<"\n";
	map_tmp_stream << "      L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png', {\n";
	map_tmp_stream << "        maxZoom: 19\n";
	map_tmp_stream << "      }).addTo(map);\n";
map_tmp_stream<<"\n";
	map_tmp_stream << "      const trackersPoints = ";
 map_tmp_stream << map_view_data.get<std::string>("trackers_points_json"); 
	map_tmp_stream << ";\n";
	map_tmp_stream << "      const allBounds = [];\n";
	map_tmp_stream << "      const hex = [\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"0\",\"A\",\"B\",\"C\",\"D\",\"E\",\"F\"]\n";
map_tmp_stream<<"\n";
	map_tmp_stream << "      Object.entries(trackersPoints).forEach(([trackerId, points]) => {\n";
	map_tmp_stream << "        if (!points || points.length === 0) return;\n";
	map_tmp_stream << "        let rC = \"#\"\n";
	map_tmp_stream << "        for(let i=0; i<6; i++){\n";
	map_tmp_stream << "          rC += hex[Math.floor(Math.random() * hex.length)]\n";
	map_tmp_stream << "        }\n";
	map_tmp_stream << "        // Draw Route\n";
	map_tmp_stream << "        const polyline = L.polyline(points, {\n";
	map_tmp_stream << "          color: rC,\n";
	map_tmp_stream << "          weight: 3,\n";
	map_tmp_stream << "          opacity: 0.8\n";
	map_tmp_stream << "        }).addTo(map);\n";
	map_tmp_stream << "        \n";
	map_tmp_stream << "        allBounds.push(polyline.getBounds());\n";
map_tmp_stream<<"\n";
	map_tmp_stream << "        // Draw last position marker\n";
	map_tmp_stream << "        const lastPt = points[points.length - 1];\n";
	map_tmp_stream << "        L.circleMarker(lastPt, {\n";
	map_tmp_stream << "          radius: 6,\n";
	map_tmp_stream << "          fillColor: rC,\n";
	map_tmp_stream << "          color: rC,\n";
	map_tmp_stream << "          weight: 1,\n";
	map_tmp_stream << "          opacity: 1,\n";
	map_tmp_stream << "          fillOpacity: 0.9\n";
	map_tmp_stream << "        }).addTo(map).bindPopup('Serial Number: ' + trackerId);\n";
	map_tmp_stream << "      });\n";
map_tmp_stream<<"\n";
	map_tmp_stream << "      // Zoom out to fit all tracker routes\n";
	map_tmp_stream << "      if (allBounds.length > 0) {\n";
	map_tmp_stream << "        const group = L.featureGroup(allBounds.map(b => L.rectangle(b)));\n";
	map_tmp_stream << "        map.fitBounds(group.getBounds(), { padding: [30, 30], maxZoom: 15 });\n";
	map_tmp_stream << "      }\n";
	map_tmp_stream << "    });\n";
	map_tmp_stream << "  </script>\n";
	map_tmp_stream << "</body>\n";
	map_tmp_stream << "</html>\n";
if(layoutName.empty())
{
std::string ret{std::move(map_tmp_stream.str())};
return ret;
}else
{
auto templ = DrTemplateBase::newTemplate(layoutName);
if(!templ) return "";
HttpViewData data = map_view_data;
auto str = std::move(map_tmp_stream.str());
if(!str.empty() && str[str.length()-1] == '\n') str.resize(str.length()-1);
data[""] = std::move(str);
return templ->genText(data);
}
}
