code: def make_html_report(
      relevant_features_df: pd.DataFrame,
      relevant_datasources_df: pd.DataFrame,
      metrics_df: Optional[pd.DataFrame],
      autofe_descriptions_df: Optional[pd.DataFrame],
      search_id: str,
      email: Optional[str] = None,
      search_keys: Optional[List[str]] = None,
  ):
      # relevant_features_df = relevant_features_df.copy()
      # relevant_features_df["Feature name"] = relevant_features_df["Feature name"].apply(
      #     lambda x: "*" + x if x.contains("_autofe_") else x
      # )
      relevant_datasources_df = relevant_datasources_df.copy()
      relevant_datasources_df["action"] = (
          f"""<a href="https://upgini.com/requet-a-quote?search-id={search_id}">"""
          """<button type="button">Request a quote</button></a>"""
      )
      relevant_datasources_df.rename(
          columns={"action": "&nbsp;"}, inplace=True
      )
      return f"""<html>
          <head>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
              <style>
                  @page {{
                      size: a4 portrait;
                      @frame header_frame {{
                          -pdf-frame-content: header_content;
                          left: 10pt; width: 574pt; top: 10pt; height: 40pt;
                          /*-pdf-frame-border: 1;*/
                      }}
                      @frame content_frame {{
                          left: 10pt; width: 574pt; top: 50pt; height: 752pt;
                          /*-pdf-frame-border: 1;*/
                      }}
                      @frame footer_frame {{
                          -pdf-frame-content: footer_content;
                          left: 10pt; width: 574pt; top: 802pt; height: 30pt;
                          /*-pdf-frame-border: 1;*/
                      }}
                  }}
  
                  @font-face {{
                      font-family: "Alice-Regular";
                      src: url("/fonts/Alice-Regular.ttf") format("truetype");
                  }}
  
                  body {{
                      font-family: "Alice-Regular", Arial, sans-serif;
                  }}
  
                  #header_content {{
                      background-color: black;
                      color: white;
                      text-align: center;
                      padding-top: 7pt;
                      font-size: 15pt;
                      height: 38pt;
                  }}
  
                  h1 {{
                      text-align: center;
                  }}
  
                  .upgini-df {{
                      font-size: 5pt;
                      border: 1px solid black;
                      table-layout: auto !important;
                  }}
  
                  .upgini-df thead th {{
                      font-weight:bold;
                      text-align: center;
                      padding: 0.5em;
                      width: auto !important;
                      border: 1px solid black;
                      border-collapse: collapse;
                  }}
  
                  .upgini-df tbody td {{
                      padding: 0.5em;
                      width: auto !important;
                      border: 1px solid black;
                      border-collapse: collapse;
                      -pdf-keep-in-frame-mode: shrink;
                  }}
  
                  .upgini-text {{
                      text-align: left;
                  }}
  
                  .upgini-number {{
                      text-align: center;
                  }}
              </style>
          </head>
          <body>
              <div id="header_content">UPGINI</div>
              <div id="footer_content">
                  © Upgini</br>
                  sales@upgini.com
              </div>
  
              <h1>Data search report</h1>
              <p style="text-align: right">
                  <b>Datetime:</b> {datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M UTC')}</br>
                  <b>Search ID:</b> {search_id}</br>
                  {"<b>Initiator:</b> " + email if email else ""}
              </p>
              <p>This report was generated automatically by Upgini.</p>
              <p>The report shows a listing of relevant features for your
              ML task and accuracy metrics after enrichment.</p>
              {
                  f"The following primary keys was used for data search: {search_keys}"
                  if search_keys is not None
                  else ""
              }
              {"<h3>All relevant features. Accuracy after enrichment</h3>" + make_table(metrics_df)
               if metrics_df is not None
               else ""
              }
              <h3>Relevant data sources</h3>
              {make_table(relevant_datasources_df)}
              <h3>All relevant features. Listing</h3>
              {make_table(relevant_features_df, wrap_long_string=25)}
              {"<h3>Description of AutoFE feature names</h3>" + make_table(autofe_descriptions_df, wrap_long_string=25)
               if autofe_descriptions_df is not None
               else ""
              }
              <p>To buy found data sources, please contact: <a href='mailto:sales@upgini.com'>sales@upgini.com</a></p>
              <p>Best regards, </br><b>Upgini Team</b></p>
          </body>
      </html>"""
  
file_path: upgini/src/upgini/utils/display_utils.py
imports: import base64
  import math
  import textwrap
  import urllib.parse
  import uuid
  from datetime import datetime, timezone
  from io import BytesIO
  from typing import Callable, List, Optional
  import pandas
  from xhtml2pdf import pisa
label_desc: Use image node_id 5 for calling a global function with example usage: make_html_report(relevant_features_df, relevant_datasources_df, metrics_df, autofe_descriptions_df, search_id, email, search_keys) and returns: str, datetime, str, search_id, str, unknown, str, unknown, str, unknown, str, make_table, str, make_table, str, unknown, str