<?php
$isSingle = ($mode ?? 'group') === 'single';
$isRaccordementClients = str_contains((string)($_SERVER['REQUEST_URI'] ?? ''), '/raccordement-clients');
$moduleBasePath = $isRaccordementClients ? '/raccordement-clients' : '/maintenance-ftth';
$reportLabels = [
    'brouillon' => ['Brouillon', '#6c757d'],
    'soumis' => ['Soumis', '#f59f00'],
    'validé' => ['Validé', '#198754'],
    'rejeté' => ['Rejeté', '#dc3545'],
];
$satLabels = [
  'très_satisfait' => 'Très satisfait',
  'satisfait' => 'Satisfait',
  'peu_satisfait' => 'Peu satisfait',
  'non_satisfait' => 'Non satisfait',
];
?>
<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title><?= htmlspecialchars($title ?? 'Rapport FTTH') ?></title>
  <style>
    :root{
      --ink:#12344d;
      --muted:#5f7482;
      --line:#dbe7ef;
      --surface:#f4f9fb;
      --accent:#1f7a8c;
      --accent-soft:#e8f5f6;
      --paper:#fffdf8;
      --warm:#f4b942;
      --rose:#d96c75;
    }
    *{box-sizing:border-box}
    body{margin:0;font-family:Georgia,"Times New Roman",serif;color:var(--ink);background:radial-gradient(circle at top,#f4efe4 0%,#edf3f6 34%,#e6eef2 100%)}
    body::before{content:'';position:fixed;inset:0;pointer-events:none;background:linear-gradient(135deg,rgba(244,185,66,.08) 0%,rgba(217,108,117,.05) 32%,transparent 72%)}
    .report-shell{max-width:1240px;margin:0 auto;padding:34px 24px 60px;position:relative}
    .report-topbar{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:20px}
    .report-topbar-actions{display:flex;gap:10px;flex-wrap:wrap}
    .report-btn{appearance:none;border:0;border-radius:999px;padding:12px 18px;font-weight:700;text-decoration:none;cursor:pointer;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .report-btn-primary{background:var(--ink);color:#fff;box-shadow:0 12px 24px rgba(18,52,77,.18)}
    .report-btn-light{background:rgba(255,255,255,.82);backdrop-filter:blur(8px);color:var(--ink);border:1px solid rgba(255,255,255,.7)}
    .report-topbar strong{display:block;font-size:15px;letter-spacing:.08em;text-transform:uppercase;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .report-topbar span{color:#5f7482;font-size:14px;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .report-masthead{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr);gap:18px;margin-bottom:18px}
    .report-masthead-card{padding:22px 24px;border-radius:24px;background:rgba(255,255,255,.78);border:1px solid rgba(255,255,255,.74);backdrop-filter:blur(10px);box-shadow:0 20px 40px rgba(18,52,77,.08)}
    .report-masthead-kicker{display:inline-flex;align-items:center;gap:8px;padding:7px 12px;border-radius:999px;background:#edf5f8;color:var(--accent);font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .report-masthead-title{margin:14px 0 8px;font-size:26px;line-height:1.1}
    .report-masthead-copy{margin:0;color:var(--muted);font-size:15px;line-height:1.55;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .report-doc-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
    .report-doc-item{padding:14px 16px;border-radius:18px;background:#fff;border:1px solid #e4edf2}
    .report-doc-item strong{display:block;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin-bottom:6px;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .report-doc-item span{display:block;font-size:15px;color:var(--ink);font-weight:700;line-height:1.35}
    .report-hero{padding:34px 34px 28px;border-radius:32px;background:linear-gradient(145deg,#112f43 0%,#185b69 42%,#6ea26f 100%);color:#fff;box-shadow:0 28px 60px rgba(18,52,77,.22);position:relative;overflow:hidden}
    .report-hero::before{content:'';position:absolute;right:-90px;top:-60px;width:260px;height:260px;border-radius:50%;background:rgba(255,255,255,.08)}
    .report-hero::after{content:'';position:absolute;left:40%;bottom:-120px;width:300px;height:220px;border-radius:50%;background:rgba(244,185,66,.16);filter:blur(10px)}
    .report-hero > *{position:relative;z-index:1}
    .report-kicker{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;border-radius:999px;background:rgba(255,255,255,.14);font-size:12px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .report-title{font-size:clamp(34px,4.6vw,58px);line-height:1;margin:18px 0 12px;font-weight:700;max-width:900px}
    .report-copy{max-width:760px;font-size:17px;line-height:1.55;color:rgba(255,255,255,.86);margin:0}
    .report-meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-top:26px}
    .report-meta-card{padding:18px 20px;border-radius:22px;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.14);backdrop-filter:blur(8px)}
    .report-meta-card strong{display:block;font-size:30px;margin-bottom:6px;font-weight:700}
    .report-meta-card span{font-size:13px;color:rgba(255,255,255,.82);font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif;text-transform:uppercase;letter-spacing:.05em}
    .report-list{display:grid;gap:18px;margin-top:24px}
    .ticket-card{background:linear-gradient(180deg,#fffefb 0%,#ffffff 100%);border:1px solid rgba(18,52,77,.08);border-radius:30px;box-shadow:0 24px 48px rgba(18,52,77,.1);overflow:hidden;position:relative}
    .ticket-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:6px;background:linear-gradient(180deg,var(--accent) 0%,var(--warm) 100%)}
    .ticket-head{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;padding:28px 28px 20px;border-bottom:1px solid #edf3f6;background:linear-gradient(180deg,#fffefb 0%,#f8fbfd 100%)}
    .ticket-ref{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;border-radius:999px;background:linear-gradient(180deg,#f8fbf6 0%,#e8f5f6 100%);color:var(--accent);font-size:12px;font-weight:800;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif;letter-spacing:.05em;text-transform:uppercase}
    .ticket-name{font-size:30px;font-weight:700;line-height:1.04;margin:16px 0 10px;max-width:850px}
    .ticket-subline{display:flex;flex-wrap:wrap;gap:10px 16px;color:var(--muted);font-size:14px;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .ticket-subline span{display:inline-flex;align-items:center;gap:.5rem;padding:.45rem .7rem;border-radius:999px;background:#f7fafc;border:1px solid #e7eef2}
    .ticket-state{display:flex;flex-direction:column;align-items:flex-end;gap:10px}
    .ticket-pill{display:inline-flex;align-items:center;gap:8px;padding:9px 13px;border-radius:999px;background:#eef4f7;color:var(--ink);font-size:12px;font-weight:800;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif;letter-spacing:.04em;text-transform:uppercase}
    .ticket-body{padding:24px 28px 28px;background:linear-gradient(180deg,#ffffff 0%,var(--paper) 100%)}
    .ticket-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}
    .ticket-panel{padding:18px;border:1px solid #e6ecef;border-radius:20px;background:linear-gradient(180deg,#ffffff 0%,#f9fbfc 100%)}
    .ticket-panel h3{margin:0 0 12px;font-size:12px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .ticket-lines{display:grid;gap:10px}
    .ticket-line{display:grid;gap:4px}
    .ticket-line strong{font-size:12px;color:var(--muted);font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif;letter-spacing:.05em;text-transform:uppercase}
    .ticket-line span{font-size:15px;color:var(--ink);word-break:break-word;line-height:1.45}
    .ticket-tags{display:flex;flex-wrap:wrap;gap:8px}
    .ticket-tag{display:inline-flex;align-items:center;padding:8px 11px;border-radius:999px;background:#fff;border:1px solid var(--line);font-size:12px;color:var(--muted);font-weight:700;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .ticket-note{margin-top:18px;padding:18px 20px;border-radius:20px;background:linear-gradient(180deg,#ffffff 0%,#fcfdfd 100%);border:1px dashed #c8d9e2;color:var(--muted);font-size:14px;box-shadow:inset 0 1px 0 rgba(255,255,255,.8)}
    .ticket-note > strong:first-child,.ticket-section-title{display:block;margin-bottom:4px;font-size:12px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .ticket-section-title{margin:22px 0 12px}
    .ticket-photos{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-top:16px}
    .ticket-photo-card{padding:12px;border:1px solid var(--line);border-radius:18px;background:#fff;box-shadow:0 10px 18px rgba(18,52,77,.06)}
    .ticket-photo-card img{display:block;width:100%;height:150px;object-fit:cover;border-radius:14px;background:#eef4f7}
    .ticket-photo-card strong{display:block;margin:10px 0 6px;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .ticket-photo-card p{margin:0;font-size:13px;color:var(--muted);white-space:pre-line}
    .ticket-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px;margin-top:16px}
    .ticket-kpi{padding:15px 16px;border-radius:18px;background:#fff;border:1px solid var(--line);box-shadow:0 8px 16px rgba(18,52,77,.05)}
    .ticket-kpi strong{display:block;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin-bottom:6px;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .ticket-kpi span{display:block;font-size:15px;color:var(--ink);font-weight:700;line-height:1.35}
    .ticket-signatures{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin-top:16px}
    .ticket-signature{padding:14px;border:1px solid var(--line);border-radius:18px;background:#fff;box-shadow:0 8px 16px rgba(18,52,77,.05)}
    .ticket-signature img{display:block;width:100%;max-height:160px;object-fit:contain;border-radius:12px;background:#f8fbfd}
    .ticket-signature strong{display:block;margin-bottom:10px;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    .report-footer{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-top:20px;padding:16px 20px;border-radius:20px;background:rgba(255,255,255,.72);border:1px solid rgba(255,255,255,.7);color:var(--muted);font-size:13px;font-family:"Segoe UI",Tahoma,Geneva,Verdana,sans-serif}
    @media (max-width: 920px){
      .report-masthead{grid-template-columns:1fr}
      .ticket-grid{grid-template-columns:1fr}
      .ticket-head{padding:20px 18px 16px;flex-direction:column}
      .ticket-state{align-items:flex-start}
      .ticket-body{padding:18px}
      .report-shell{padding:18px 14px 40px}
    }
    @media print{
      body{background:#fff}
      .report-shell{max-width:none;padding:0}
      .report-topbar{display:none}
      .report-hero{box-shadow:none;border-radius:0;print-color-adjust:exact;-webkit-print-color-adjust:exact}
      .ticket-card,.ticket-note,.ticket-kpi,.ticket-photo-card,.ticket-signature{box-shadow:none}
      .ticket-card{break-inside:avoid;page-break-inside:avoid}
    }
  </style>
</head>
<body>
  <div class="report-shell">
    <div class="report-topbar">
      <div>
        <strong><?= htmlspecialchars($title ?? 'Rapport FTTH') ?></strong><br>
        <span style="color:#5f7482;font-size:14px">Généré le <?= htmlspecialchars($generatedAt ?? '') ?> par <?= htmlspecialchars($user['name'] ?? 'Utilisateur') ?></span>
      </div>
      <div class="report-topbar-actions">
        <button type="button" class="report-btn report-btn-primary" onclick="window.print()">Imprimer</button>
        <a href="<?= htmlspecialchars(route_url($moduleBasePath)) ?>" class="report-btn report-btn-light">Retour au portefeuille</a>
      </div>
    </div>

    <section class="report-masthead">
      <div class="report-masthead-card">
        <div class="report-masthead-kicker">Dossier d'intervention FTTH</div>
        <h2 class="report-masthead-title">Édition prête pour revue d'exploitation, impression et transmission interne.</h2>
        <p class="report-masthead-copy">Le document regroupe la situation client, les repères réseau, le suivi terrain et les éléments de preuve collectés pendant l'intervention pour accélérer la validation et l'escalade.</p>
      </div>
      <div class="report-masthead-card">
        <div class="report-doc-grid">
          <div class="report-doc-item">
            <strong>Type d'édition</strong>
            <span><?= $isSingle ? 'Rapport individuel' : 'Rapport groupé' ?></span>
          </div>
          <div class="report-doc-item">
            <strong>Périmètre</strong>
            <span><?= count($tickets) ?> ticket(s)</span>
          </div>
          <div class="report-doc-item">
            <strong>Émetteur</strong>
            <span><?= htmlspecialchars($user['name'] ?? 'Utilisateur') ?></span>
          </div>
          <div class="report-doc-item">
            <strong>Généré le</strong>
            <span><?= htmlspecialchars($generatedAt ?? '') ?></span>
          </div>
        </div>
      </div>
    </section>

    <section class="report-hero">
      <div class="report-kicker">Synthèse FTTH</div>
      <h1 class="report-title"><?= $isSingle ? 'Rapport individuel de ticket FTTH' : 'Rapport groupé de la sélection FTTH' ?></h1>
      <p class="report-copy">
        <?= $isSingle
          ? 'Cette vue rassemble les informations opérationnelles, terrain et réseau du ticket sélectionné pour une consultation ou une impression immédiate.'
          : 'Cette édition consolide les tickets sélectionnés pour préparer une revue d’exploitation, un point de dispatching ou un partage terrain.' ?>
      </p>
      <div class="report-meta">
        <div class="report-meta-card">
          <strong><?= count($tickets) ?></strong>
          <span>ticket(s) dans le rapport</span>
        </div>
        <div class="report-meta-card">
          <strong><?= count(array_filter($tickets, static fn(array $ticket): bool => !empty($ticket['assigned_to']))) ?></strong>
          <span>ticket(s) déjà assigné(s)</span>
        </div>
        <div class="report-meta-card">
          <strong><?= count(array_filter($tickets, static fn(array $ticket): bool => ($ticket['report_status'] ?? '') === 'validé')) ?></strong>
          <span>rapport(s) déjà validé(s)</span>
        </div>
      </div>
    </section>

    <section class="report-list">
      <?php foreach ($tickets as $ticket):
        $reportConfig = $reportLabels[$ticket['report_status'] ?? ''] ?? ['Non démarré', '#6c757d'];
        $constatPhotos = $ticket['constat_photos'] ?? [];
        $interventionPhotos = $ticket['intervention_photos'] ?? [];
        $impactedEquipment = $ticket['impacted_equipment'] ?? [];
        $materialsUsed = $ticket['materials_used'] ?? [];
        $networkRefs = array_values(array_filter([
          !empty($ticket['sro_client']) ? 'SRO ' . $ticket['sro_client'] : null,
          !empty($ticket['jdv_client']) ? 'JDV ' . $ticket['jdv_client'] : null,
          !empty($ticket['pco_client']) ? 'PCO ' . $ticket['pco_client'] : null,
        ]));
        $ticketStateLabel = ucfirst(str_replace('_', ' ', (string)($ticket['status'] ?? '')));
      ?>
      <article class="ticket-card">
        <div class="ticket-head">
          <div>
            <span class="ticket-ref">#<?= htmlspecialchars($ticket['ref_code'] ?: (string)$ticket['id']) ?></span>
            <div class="ticket-name"><?= htmlspecialchars($ticket['client_name'] ?? 'Ticket FTTH') ?></div>
            <div class="ticket-subline">
              <?php if (!empty($ticket['client_code'])): ?><span>Abonnement <?= htmlspecialchars($ticket['client_code']) ?></span><?php endif; ?>
              <?php if (!empty($ticket['fixed_line'])): ?><span>Ligne fixe <?= htmlspecialchars($ticket['fixed_line']) ?></span><?php endif; ?>
              <?php if (!empty($ticket['site_name'])): ?><span><?= htmlspecialchars($ticket['site_name']) ?></span><?php endif; ?>
              <span>Statut ticket <?= htmlspecialchars($ticketStateLabel) ?></span>
            </div>
          </div>
          <div class="ticket-state">
            <span class="ticket-pill">Priorité <?= htmlspecialchars($ticket['priority'] ?? 'Moyenne') ?></span>
            <span class="ticket-pill" style="background:<?= htmlspecialchars($reportConfig[1]) ?>20;color:<?= htmlspecialchars($reportConfig[1]) ?>">Rapport <?= htmlspecialchars($reportConfig[0]) ?></span>
          </div>
        </div>
        <div class="ticket-body">
          <div class="ticket-grid">
            <section class="ticket-panel">
              <h3>Coordonnées client</h3>
              <div class="ticket-lines">
                <?php if (!empty($ticket['client_phone']) || !empty($ticket['client_phone2'])): ?><div class="ticket-line"><strong>Téléphone</strong><span><?= htmlspecialchars($ticket['client_phone'] ?: '—') ?><?php if (!empty($ticket['client_phone2'])): ?>, <?= htmlspecialchars($ticket['client_phone2']) ?><?php endif; ?></span></div><?php endif; ?>
                <?php if (!empty($ticket['client_address'])): ?><div class="ticket-line"><strong>Adresse</strong><span><?= htmlspecialchars($ticket['client_address']) ?></span></div><?php endif; ?>
                <?php if (!empty($ticket['company_name'])): ?><div class="ticket-line"><strong>Entreprise / porteur</strong><span><?= htmlspecialchars($ticket['company_name']) ?></span></div><?php endif; ?>
                <?php if (!empty($ticket['assigned_to'])): ?><div class="ticket-line"><strong>Technicien(s)</strong><span><?= htmlspecialchars($ticket['assigned_to']) ?></span></div><?php endif; ?>
              </div>
            </section>

            <section class="ticket-panel">
              <h3>Vue réseau</h3>
              <div class="ticket-lines">
                <?php if (!empty($networkRefs)): ?>
                <div class="ticket-line">
                  <strong>Repères</strong>
                  <span class="ticket-tags">
                    <?php foreach ($networkRefs as $networkRef): ?>
                    <span class="ticket-tag"><?= htmlspecialchars($networkRef) ?></span>
                    <?php endforeach; ?>
                  </span>
                </div>
                <?php endif; ?>
                <?php if (!empty($ticket['nature_intervention'])): ?><div class="ticket-line"><strong>Nature</strong><span><?= htmlspecialchars($ticket['nature_intervention']) ?></span></div><?php endif; ?>
                <?php if (!empty($ticket['avancement'])): ?><div class="ticket-line"><strong>Avancement</strong><span><?= htmlspecialchars($ticket['avancement']) ?></span></div><?php endif; ?>
                <?php if (!empty($ticket['cause_comment'])): ?><div class="ticket-line"><strong>Cause</strong><span><?= htmlspecialchars($ticket['cause_comment']) ?></span></div><?php endif; ?>
              </div>
            </section>

            <section class="ticket-panel">
              <h3>Fiche terrain</h3>
              <div class="ticket-lines">
                <div class="ticket-line"><strong>État du rapport</strong><span><?= htmlspecialchars($reportConfig[0]) ?></span></div>
                <?php if (!empty($ticket['technician_name'])): ?><div class="ticket-line"><strong>Technicien</strong><span><?= htmlspecialchars($ticket['technician_name']) ?></span></div><?php endif; ?>
                <?php if (!empty($ticket['operation_type'])): ?><div class="ticket-line"><strong>Type d'opération</strong><span><?= htmlspecialchars(ucfirst((string)$ticket['operation_type'])) ?></span></div><?php endif; ?>
                <?php if (!empty($ticket['intervention_date'])): ?><div class="ticket-line"><strong>Date d’intervention</strong><span><?= htmlspecialchars($ticket['intervention_date']) ?><?php if (!empty($ticket['intervention_start'])): ?> à <?= htmlspecialchars(substr((string)$ticket['intervention_start'], 0, 5)) ?><?php endif; ?></span></div><?php endif; ?>
                <?php if (!empty($ticket['intervention_end'])): ?><div class="ticket-line"><strong>Fin d’intervention</strong><span><?= htmlspecialchars(substr((string)$ticket['intervention_end'], 0, 5)) ?></span></div><?php endif; ?>
                <?php if (!empty($ticket['submitted_at'])): ?><div class="ticket-line"><strong>Soumis le</strong><span><?= htmlspecialchars(date('d/m/Y H:i', strtotime((string)$ticket['submitted_at']))) ?></span></div><?php endif; ?>
                <?php if (!empty($ticket['validated_at'])): ?><div class="ticket-line"><strong>Validé le</strong><span><?= htmlspecialchars(date('d/m/Y H:i', strtotime((string)$ticket['validated_at']))) ?></span></div><?php endif; ?>
                <?php if (isset($ticket['service_restored']) && $ticket['service_restored'] !== null): ?><div class="ticket-line"><strong>Service rétabli</strong><span><?= (int)$ticket['service_restored'] === 1 ? 'Oui' : 'Non' ?></span></div><?php endif; ?>
              </div>
            </section>
          </div>

          <?php if (!empty($impactedEquipment) || !empty($materialsUsed) || !empty($ticket['client_name_onsite']) || !empty($ticket['submit_gps_lat']) || !empty($ticket['submit_gps_lng']) || !empty($ticket['client_signature_path']) || !empty($ticket['agent_signature_path']) || !empty($ticket['satisfaction_service']) || !empty($ticket['satisfaction_delay']) || !empty($ticket['satisfaction_quality']) || !empty($ticket['satisfaction_behavior'])): ?>
          <div class="ticket-section-title">Données liées à la fiche terrain</div>
          <?php endif; ?>

          <?php if (!empty($impactedEquipment)): ?>
          <div class="ticket-note">
            <strong>Équipements impactés</strong>
            <div class="ticket-tags" style="margin-top:10px">
              <?php foreach ($impactedEquipment as $item): ?>
              <span class="ticket-tag"><?= htmlspecialchars((string)($item['name'] ?? '')) ?></span>
              <?php endforeach; ?>
            </div>
          </div>
          <?php endif; ?>

          <?php if (!empty($materialsUsed)): ?>
          <div class="ticket-note">
            <strong>Matériaux et pièces utilisés</strong>
            <div class="ticket-kpis">
              <?php foreach ($materialsUsed as $material): ?>
              <div class="ticket-kpi">
                <strong>Désignation</strong>
                <span><?= htmlspecialchars((string)($material['name'] ?? '')) ?><?= !empty($material['qty']) ? ' x ' . htmlspecialchars((string)$material['qty']) : '' ?></span>
              </div>
              <?php endforeach; ?>
            </div>
          </div>
          <?php endif; ?>

          <?php if (!empty($ticket['satisfaction_service']) || !empty($ticket['satisfaction_delay']) || !empty($ticket['satisfaction_quality']) || !empty($ticket['satisfaction_behavior']) || !empty($ticket['client_name_onsite']) || !empty($ticket['client_remarks']) || isset($ticket['service_restored'])): ?>
          <div class="ticket-note">
            <strong>Appréciation client</strong>
            <div class="ticket-kpis">
              <?php if (!empty($ticket['satisfaction_service'])): ?><div class="ticket-kpi"><strong>Service</strong><span><?= htmlspecialchars($satLabels[$ticket['satisfaction_service']] ?? (string)$ticket['satisfaction_service']) ?></span></div><?php endif; ?>
              <?php if (!empty($ticket['satisfaction_delay'])): ?><div class="ticket-kpi"><strong>Délai</strong><span><?= htmlspecialchars($satLabels[$ticket['satisfaction_delay']] ?? (string)$ticket['satisfaction_delay']) ?></span></div><?php endif; ?>
              <?php if (!empty($ticket['satisfaction_quality'])): ?><div class="ticket-kpi"><strong>Qualité</strong><span><?= htmlspecialchars($satLabels[$ticket['satisfaction_quality']] ?? (string)$ticket['satisfaction_quality']) ?></span></div><?php endif; ?>
              <?php if (!empty($ticket['satisfaction_behavior'])): ?><div class="ticket-kpi"><strong>Comportement</strong><span><?= htmlspecialchars($satLabels[$ticket['satisfaction_behavior']] ?? (string)$ticket['satisfaction_behavior']) ?></span></div><?php endif; ?>
              <?php if (!empty($ticket['client_name_onsite'])): ?><div class="ticket-kpi"><strong>Client sur site</strong><span><?= htmlspecialchars((string)$ticket['client_name_onsite']) ?></span></div><?php endif; ?>
              <?php if (isset($ticket['service_restored']) && $ticket['service_restored'] !== null): ?><div class="ticket-kpi"><strong>Service rétabli</strong><span><?= (int)$ticket['service_restored'] === 1 ? 'Oui' : 'Non' ?></span></div><?php endif; ?>
            </div>
            <?php if (!empty($ticket['client_remarks'])): ?><div style="margin-top:10px"><strong>Remarques client</strong> : <?= nl2br(htmlspecialchars((string)$ticket['client_remarks'])) ?></div><?php endif; ?>
          </div>
          <?php endif; ?>

          <?php if (!empty($ticket['client_signature_path']) || !empty($ticket['agent_signature_path']) || !empty($ticket['submit_gps_lat']) || !empty($ticket['submit_gps_lng'])): ?>
          <div class="ticket-note">
            <strong>Signatures et géolocalisation</strong>
            <?php if (!empty($ticket['submit_gps_lat']) && !empty($ticket['submit_gps_lng'])): ?>
            <div style="margin-top:10px"><strong>GPS de soumission</strong> : <?= htmlspecialchars((string)$ticket['submit_gps_lat']) ?>, <?= htmlspecialchars((string)$ticket['submit_gps_lng']) ?></div>
            <?php endif; ?>
            <?php if (!empty($ticket['client_signature_path']) || !empty($ticket['agent_signature_path'])): ?>
            <div class="ticket-signatures">
              <?php if (!empty($ticket['client_signature_path'])): ?>
              <div class="ticket-signature">
                <strong>Signature client</strong>
                <img src="<?= htmlspecialchars(ftth_upload_url($ticket['id'] ?? 0, $ticket['client_signature_path'] ?? '')) ?>" alt="Signature client">
              </div>
              <?php endif; ?>
              <?php if (!empty($ticket['agent_signature_path'])): ?>
              <div class="ticket-signature">
                <strong>Signature agent</strong>
                <img src="<?= htmlspecialchars(ftth_upload_url($ticket['id'] ?? 0, $ticket['agent_signature_path'] ?? '')) ?>" alt="Signature agent">
              </div>
              <?php endif; ?>
            </div>
            <?php endif; ?>
          </div>
          <?php endif; ?>

          <?php if (!empty($ticket['description']) || !empty($ticket['constat_comments']) || !empty($ticket['general_comments']) || !empty($ticket['client_remarks'])): ?>
          <div class="ticket-note">
            <?php if (!empty($ticket['description'])): ?><div><strong>Description</strong> : <?= nl2br(htmlspecialchars((string)$ticket['description'])) ?></div><?php endif; ?>
            <?php if (!empty($ticket['constat_comments'])): ?><div style="margin-top:8px"><strong>Constat terrain</strong> : <?= nl2br(htmlspecialchars((string)$ticket['constat_comments'])) ?></div><?php endif; ?>
            <?php if (!empty($ticket['general_comments'])): ?><div style="margin-top:8px"><strong>Commentaires d’intervention</strong> : <?= nl2br(htmlspecialchars((string)$ticket['general_comments'])) ?></div><?php endif; ?>
            <?php if (!empty($ticket['client_remarks'])): ?><div style="margin-top:8px"><strong>Remarques client</strong> : <?= nl2br(htmlspecialchars((string)$ticket['client_remarks'])) ?></div><?php endif; ?>
          </div>
          <?php endif; ?>

          <?php if (!empty($constatPhotos) || !empty($interventionPhotos)): ?>
          <div class="ticket-note">
            <strong>Photos de la fiche terrain</strong>
            <?php if (!empty($constatPhotos)): ?>
            <div style="margin-top:10px;font-weight:700;color:#12344d">Constat</div>
            <div class="ticket-photos">
              <?php foreach ($constatPhotos as $photo): ?>
              <div class="ticket-photo-card">
                <img src="<?= htmlspecialchars(upload_url('ftth/'.$ticket['id'].'/'.$photo['photo_path'])) ?>" alt="Photo de constat">
                <strong>Commentaire</strong>
                <p><?= htmlspecialchars(trim((string)($photo['comment'] ?? '')) !== '' ? (string)$photo['comment'] : 'Aucun commentaire') ?></p>
              </div>
              <?php endforeach; ?>
            </div>
            <?php endif; ?>
            <?php if (!empty($interventionPhotos)): ?>
            <div style="margin-top:14px;font-weight:700;color:#12344d">Intervention</div>
            <div class="ticket-photos">
              <?php foreach ($interventionPhotos as $photo): ?>
              <div class="ticket-photo-card">
                <img src="<?= htmlspecialchars(upload_url('ftth/'.$ticket['id'].'/'.$photo['photo_path'])) ?>" alt="Photo d'intervention">
                <strong>Commentaire</strong>
                <p><?= htmlspecialchars(trim((string)($photo['comment'] ?? '')) !== '' ? (string)$photo['comment'] : 'Aucun commentaire') ?></p>
              </div>
              <?php endforeach; ?>
            </div>
            <?php endif; ?>
          </div>
          <?php endif; ?>
        </div>
      </article>
      <?php endforeach; ?>
    </section>

    <div class="report-footer">
      <div>Document opérationnel FTTH. Les informations affichées reflètent l'état consolidé au moment de la génération.</div>
      <div><?= $isSingle ? 'Usage: validation unitaire / suivi terrain' : 'Usage: revue portefeuille / comité de pilotage' ?></div>
    </div>
  </div>
</body>
</html>