{% include '@Application/inc/central_header.html.twig' %}
{% include '@HoneybeeWeb/inc/_web_design_system.html.twig' %}
{% include '@HoneybeeWeb/inc/_hb360_tags.html.twig' %}
<style>
.hbm-wrap { max-width: 900px; margin: 0 auto; padding: 0 28px; }
.hbm-hero { background: var(--n-cream); padding: 120px 0 32px; }
.hbm-card { background: var(--n-white); border: 1px solid var(--n-border-md); border-radius: var(--n-radius); padding: 26px; box-shadow: var(--n-shadow-sm); }
.hbm-switch { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 16px; }
.hbm-switch a { font-size: 12.5px; font-weight: 600; color: var(--n-muted); border: 1.5px solid var(--n-border-md); border-radius: 100px; padding: 6px 14px; text-decoration: none; }
.hbm-switch a.active { background: var(--n-dark); color: #fff; border-color: var(--n-dark); }
.hbm-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
.hbm-share { font-size: 12.5px; color: var(--n-muted); margin-top: 10px; word-break: break-all; }
</style>
<section class="hbm-hero">
<div class="hbm-wrap">
<div class="n-label">HoneyBee 360 Β· Your saved estimate</div>
<h1 style="font-family:'Montserrat',sans-serif;font-size:clamp(1.7rem,3.5vw,2.4rem);font-weight:900;color:var(--n-dark);letter-spacing:-.025em;line-height:1.1;margin:0 0 10px">
{% if current %}{{ current.title ?: 'Your solar estimate' }}{% else %}My solar estimates{% endif %}
</h1>
{% if current %}
<p class="n-body" style="margin:0;font-size:14px;color:var(--n-muted)">Saved {{ current.updatedAt|date('d M Y') }}{% if current.address %} Β· π {{ current.address }}{% endif %}</p>
{% endif %}
</div>
</section>
<section style="background:var(--n-cream);padding:8px 0 100px">
<div class="hbm-wrap">
{% if not storage_ready %}
<div class="hbm-card" style="text-align:center;color:var(--n-muted)">
<i class="fa-solid fa-hourglass-half" style="font-size:26px;color:var(--n-amber);display:block;margin-bottom:10px"></i>
Estimate saving is being switched on for your account β please try again shortly.<br>
Meanwhile the <a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}" style="color:var(--n-amber);font-weight:600">Instant Solar Estimate</a> works as usual.
</div>
{% elseif not current %}
<div class="hbm-card" style="text-align:center;color:var(--n-muted)">
<i class="fa-solid fa-solar-panel" style="font-size:26px;color:var(--n-amber);display:block;margin-bottom:10px"></i>
No saved estimate yet.<br><br>
<a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}" class="n-btn n-btn-amber">Run an Instant Solar Estimate <i class="fa-solid fa-bolt"></i></a>
</div>
{% else %}
{% if projects|length > 1 %}
<div class="hbm-switch">
{% for p in projects %}
<a href="{{ url('hb360_my_estimate', {'p': p.id}) }}" class="{{ p.id == current.id ? 'active' : '' }}">{{ p.title ?: ('Estimate #' ~ p.id) }}</a>
{% endfor %}
</div>
{% endif %}
{% if app.request.get('locked') %}
<div class="hbm-card" style="margin-bottom:16px;border-left:3px solid var(--n-amber)">
<b>π Package {{ app.request.get('locked') }} needs the {{ app.request.get('tier') ?: 'higher' }} plan.</b>
<span style="color:var(--n-muted);font-size:13px">Your saved estimate is untouched β upgrade to unlock this package.</span>
<a href="{{ url('honeybee_pricing') }}" class="n-btn n-btn-amber" style="margin-left:10px;padding:8px 16px;font-size:13px">See plans</a>
</div>
{% endif %}
{# ββ FUNNEL-3: My designs β every saved studio design on this account, with
the honest offer-status line and own-scoped manage actions. ββ #}
{% if my_designs is defined and my_designs|length > 0 %}
<div class="hbm-card" style="margin-bottom:16px">
<div class="n-label">HoneyWatt Β· my designs</div>
{% for d in my_designs %}
<div style="border-top:1px dashed var(--n-border-md);padding:10px 0;{{ loop.first ? 'border-top:none;' : '' }}">
<div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap">
<b style="font-size:14px">{{ d.title }}</b>
<span style="color:var(--n-muted);font-size:12.5px">
{{ d.summary.zones }} zone{{ d.summary.zones == 1 ? '' : 's' }} Β·
{{ d.summary.modules|number_format(0, ',', '.') }} modules Β·
{{ d.summary.kwp|number_format(1, ',', '.') }} kWp
{%- if d.address %} Β· {{ d.address }}{% endif %} Β· {{ d.updated }}
</span>
</div>
{% if d.offer %}
<div style="font-size:12.5px;margin-top:4px;color:var(--n-amber);font-weight:600">
Offer request{% if d.offer.recipient %} β {{ d.offer.recipient }}{% endif %}: {{ d.offer.label }}
</div>
{% endif %}
<div style="display:flex;gap:8px;margin-top:8px;flex-wrap:wrap;align-items:center">
<a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}?mydesign={{ d.id }}"
class="n-btn n-btn-amber" style="padding:6px 14px;font-size:12.5px">Open & customize</a>
<form method="post" action="{{ url('hb360_design_rename', {'id': d.id}) }}" style="display:flex;gap:6px">
<input type="text" name="title" placeholder="Renameβ¦" style="padding:6px 8px;border:1.5px solid var(--n-border-md);border-radius:6px;font-size:12.5px;width:160px">
<button type="submit" class="n-btn n-btn-outline" style="padding:6px 10px;font-size:12.5px">Rename</button>
</form>
<form method="post" action="{{ url('hb360_design_duplicate', {'id': d.id}) }}">
<button type="submit" class="n-btn n-btn-outline" style="padding:6px 10px;font-size:12.5px">Duplicate</button>
</form>
<form method="post" action="{{ url('hb360_design_delete', {'id': d.id}) }}"
onsubmit="return confirm('Delete this design? It disappears from your list (kept 30 days, then purged).');">
<button type="submit" class="n-btn n-btn-outline" style="padding:6px 10px;font-size:12.5px;color:#b4452f">Delete</button>
</form>
</div>
</div>
{% endfor %}
</div>
{% endif %}
{# ββ FUNNEL-1: the attached studio design (minimal card β the applicant design
workspace is a later slice). Figures are the CLIENT-shown pills, said so. ββ #}
{% if design is defined and design %}
<div class="hbm-card" style="margin-bottom:16px;border-left:3px solid var(--n-amber)">
<div class="n-label">HoneyWatt Β· your saved design</div>
<p style="margin:8px 0 4px;font-size:15px;font-weight:700">
{{ design.summary.zones }} zone{{ design.summary.zones == 1 ? '' : 's' }} Β·
{{ design.summary.modules|number_format(0, ',', '.') }} modules Β·
{{ design.summary.kwp|number_format(1, ',', '.') }} kWp
{%- if design.summary.components > 0 %} Β· {{ design.summary.components }} component{{ design.summary.components == 1 ? '' : 's' }}{% endif %}
</p>
<p style="margin:0;font-size:12.5px;color:var(--n-muted)">
Figures as designed in the studio{% if design.saved_at %} Β· saved {{ design.saved_at|date('d M Y H:i') }}{% endif %}.
Your layout is stored with this estimate and attached to your account.
<a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}" style="color:var(--n-amber);font-weight:600">Keep designing</a>
</p>
</div>
{% endif %}
<div class="hbm-card">
{% if estimate and estimate.ok is defined and estimate.ok %}
{% include '@HoneybeeWeb/inc/_hb360_report_body.html.twig' with {'estimate': estimate, 'report': report, 'project': current} %}
{% else %}
<div style="text-align:center;color:var(--n-muted);padding:8px 0 2px">
No estimate figures yet for this entry β run the
<a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}" style="color:var(--n-amber);font-weight:600">Instant Solar Estimate</a>
at your address to add yield, cost and payback.
</div>
{% endif %}
<div class="hbm-actions">
{% if report %}
<form method="post" action="{{ url('hb360_generate_report', {'id': current.id}) }}" style="display:flex;gap:8px;flex-wrap:wrap;align-items:center">
{% if report.equipment is defined and report.equipment.inverters.ok|default(false) %}
<select name="inverter_model" style="padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px;max-width:320px">
{% for c in report.equipment.inverters.configs|slice(0, 8) %}
{% if c.valid %}
<option value="{{ c.key }}" {{ c.key == report.equipment.chosen ? 'selected' : '' }}>{{ c.key }} Β· β¬{{ c.eur_per_kw }}/kW{{ c.preferred ? ' β
' : '' }}</option>
{% endif %}
{% endfor %}
</select>
{% endif %}
<button type="submit" class="n-btn n-btn-outline">Refresh report <i class="fa-solid fa-rotate"></i></button>
</form>
{% if current.convertedRef %}
<a href="{{ url('hb360_convert_confirm', {'id': current.id}) }}" class="n-btn n-btn-outline">EPC project: {{ current.convertedRef|split('#')|first }} <i class="fa-solid fa-arrow-up-right-from-square"></i></a>
{% else %}
<a href="{{ url('hb360_convert_confirm', {'id': current.id}) }}" class="n-btn n-btn-amber">Convert to EPC project <i class="fa-solid fa-file-signature"></i></a>
{% endif %}
<a href="{{ url('honeybee_contact') }}" class="n-btn n-btn-outline">Book a HoneyCore Site Assessment <i class="fa-solid fa-arrow-right"></i></a>
{% else %}
<form method="post" action="{{ url('hb360_generate_report', {'id': current.id}) }}">
<button type="submit" class="n-btn n-btn-amber">Generate my full feasibility report <i class="fa-solid fa-file-lines"></i></button>
</form>
<a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}" class="n-btn n-btn-outline">Re-run the estimate</a>
{% endif %}
</div>
{% if report and current.shareToken %}
<div class="hbm-share">
<i class="fa-solid fa-link" style="color:var(--n-amber)"></i> Share (read-only):
<a href="{{ url('hb360_shared_estimate', {'shareToken': current.shareToken}) }}" style="color:var(--n-amber)">{{ url('hb360_shared_estimate', {'shareToken': current.shareToken}) }}</a>
</div>
{% endif %}
{% if report %}
{% set pc_in = report.package_c.inputs|default(null) %}
<div style="margin-top:26px;border-top:2px solid var(--n-border-md);padding-top:18px">
<h3 style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:1.05rem;color:var(--n-dark);margin:0 0 4px">
{{ report.package_c is defined ? 'Update the hybrid design (Package C)' : 'Go hybrid β add battery, backup & EV charging (Package C)' }}
</h3>
<p style="font-size:12.5px;color:var(--n-muted);margin:0 0 12px">A few details about how the site runs β everything stays an estimate until a site survey.</p>
<form method="post" action="{{ url('hb360_generate_hybrid', {'id': current.id}) }}">
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px">
<label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">Daytime use (% of load)
<input type="number" name="day_share" min="10" max="95" value="{{ pc_in ? pc_in.day_share_pct : 60 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
</label>
<label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">Critical load (%)
<input type="number" name="critical_load_pct" min="0" max="100" value="{{ pc_in ? pc_in.critical_load_pct : 30 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
</label>
<label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">Grid outages (h/yr)
<input type="number" name="outage_hours_yr" min="0" max="2000" value="{{ pc_in ? pc_in.outage_hours_yr : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
</label>
</div>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-top:12px">
<label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">AC 11 kW chargers
<input type="number" name="ev_ac11" min="0" max="200" value="{{ pc_in ? pc_in.chargers.ac11|default(0) : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
</label>
<label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">AC 22 kW chargers
<input type="number" name="ev_ac22" min="0" max="200" value="{{ pc_in ? pc_in.chargers.ac22|default(0) : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
</label>
<label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">DC 50 kW chargers
<input type="number" name="ev_dc50" min="0" max="50" value="{{ pc_in ? pc_in.chargers.dc50|default(0) : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
</label>
<label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">DC 150 kW chargers
<input type="number" name="ev_dc150" min="0" max="50" value="{{ pc_in ? pc_in.chargers.dc150|default(0) : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
</label>
</div>
<button type="submit" class="n-btn n-btn-amber" style="margin-top:14px">{{ report.package_c is defined ? 'Update hybrid design' : 'Design my hybrid system' }} <i class="fa-solid fa-battery-full"></i></button>
</form>
</div>
{% set pd_in = report.package_d.inputs|default(null) %}
<div style="margin-top:26px;border-top:2px solid var(--n-border-md);padding-top:18px">
<h3 style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:1.05rem;color:var(--n-dark);margin:0 0 4px">
{{ report.package_d is defined ? 'Update the grid & connection concept (Package D)' : 'Check the grid connection (Package D)' }}
</h3>
<p style="font-size:12.5px;color:var(--n-muted);margin:0 0 12px">Scans mapped grid infrastructure near your site and drafts the DNO-enquiry briefing: connection level, protection checklist, EMS functions. Concept-grade β a chartered engineer and the grid operator decide.</p>
<form method="post" action="{{ url('hb360_generate_grid', {'id': current.id}) }}">
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px">
<label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">Feed-in cap (% of PV AC)
<input type="number" name="export_cap_pct" min="0" max="100" value="{{ pd_in ? pd_in.export_cap_pct : 100 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
</label>
<label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">Existing connection (kVA, 0 = unknown)
<input type="number" name="existing_connection_kva" min="0" max="100000" value="{{ pd_in and pd_in.existing_connection_kva ? pd_in.existing_connection_kva : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
</label>
</div>
<button type="submit" class="n-btn n-btn-amber" style="margin-top:14px">{{ report.package_d is defined ? 'Update grid concept' : 'Draft my grid concept' }} <i class="fa-solid fa-bolt-lightning"></i></button>
</form>
</div>
<div style="margin-top:26px;border-top:2px solid var(--n-border-md);padding-top:18px">
<h3 style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:1.05rem;color:var(--n-dark);margin:0 0 4px">
{{ report.package_e is defined ? 'Update the execution & operate pack (Packages E + F)' : 'Plan the build & operation (Packages E + F)' }}
</h3>
<p style="font-size:12.5px;color:var(--n-muted);margin:0 0 12px">Graded L1βL5 bill of materials, an RFQ pack for vendor enquiries, the staged commissioning checklist, and the O&M plan that closes the loop into HoneyCore monitoring. Uses everything generated above.</p>
<form method="post" action="{{ url('hb360_generate_execution', {'id': current.id}) }}">
<button type="submit" class="n-btn n-btn-amber">{{ report.package_e is defined ? 'Update execution pack' : 'Build my execution pack' }} <i class="fa-solid fa-clipboard-check"></i></button>
</form>
</div>
{% endif %}
</div>
{% endif %}
</div>
</section>
{% include '@HoneybeeWeb/footer/central_footer.html.twig' %}