const CardBody = ({ state }) => {
  const {
    submissionType,
    ein,
    rid,
    planLives,
    marketSegment,
    group,
    stateOfOperation,
    submit_system_state,
  } = state;
  return `
     <div class="d-flex flex-column col-2">
                  <span class="fw-bold">Submission Option</span>
                  <span class="display-class">${submissionType}</span>
                </div>
                <div class="d-flex flex-column col-2">
                  <span class="fw-bold">EIN</span>
                  <a class="display-class ein-link-${ein}" data-rid=${rid}>${ein}</a>
                </div>
                <div class="d-flex flex-column col-2">
                  <span class="fw-bold">Market Segment</span>
                  <span class="display-class">${marketSegment}</span>
                </div>
                <div class="d-flex flex-column col-1">
                  <span class="fw-bold">Plan Lives</span>
                  <span class="display-class">${planLives}</span>
                </div>
                <div class="d-flex flex-column col-2">
                  <span class="fw-bold">Group</span>
                  <span class="display-class">${group}</span>
                </div>
                <div class="d-flex flex-column col-1">
                  <span class="fw-bold">State of Operation</span>
                  <span class="display-class">${stateOfOperation}</span>
                </div>
                <div class="d-flex flex-column col-2">
                  <span class="fw-bold">Status</span>
                  ${submit_system_state}
                </div>`;
};

const Button = ({ props }) => {
  const { id, label, additionalButtonClasses, iconClass } = props;
  return `<button id=${id} class="flex-grow-1 m-4 w-100 fs-3 ${additionalButtonClasses}">
        ${label}
    <i class="bi mx-2 ${iconClass}"></i>
    </button>`;
};

const UploadInput = ({ props }) => {
  const { accept = "*" } = props;
  return `
  <input type="file" accept="${accept}" class="form-control form-control-lg mb-4 mx-4" />
  `;
};

const SubmissionTypeDrodDown = ({ props }) => {
  const {
    id,
    label,
    name,
    options,
    required = false,
    defaultOption = "Please Select",
  } = props;
  if (id.includes("state-input")) options = getStateCodes();
  options = [defaultOption, ...options];
  return `<div class="mb-3 row">
  <label for=${id} class="form-label col-4 col-sm-3 ${
    required ? "required-input" : ""
  }">
    ${label}
  </label>
  <select 
    class="${required ? "form-control-required" : ""}" 
    data-bs-toggle="tooltip"
    id=${id}
    name=${name}
  >
    ${options.map((elem) => {
      const value = typeof elem === "string" ? elem : elem.value;
      const text = typeof elem === "string" ? elem : elem.text;
      `<option value=${value}>${text}</option>`;
    })}
  </select>
  </div>`;
};

const ButtonContainer = ({ props }) => {
  const { planName } = props;
  return `
    <div style="height: 8rem;" class="d-flex justify-content-between flex-wrap">
      <SubmissionTypeDrodDown />
      <UploadInput />
      <Button label={"Upload Plan Document"} id={"upload-plan-${planName}"} />
      <Button label={"Cancel Upload"} id={"cancel-upload-${planName}"} />
      <Button label={"Upload Plan Document"} id={"upload-plan-${planName}"} />
    </div>
  `;
};

const TableHeader = ({ state }) => {
  const { columnLabels } = state;
  return `<thead>
  <tr>
    ${columnLabels
      .map((column) => {
        return `<th scope="col">${column}</th>`;
      })
      .join("")}
  </tr>`;
};

const TableBody = ({ state }) => {
  const { rows } = state;
  return `<tbody>
  ${rows
    .map((row) => {
      return `<tr>
      ${row
        .map((cell) => {
          const id = cell?.id ? cell.id : "";
          const text = cell?.text ? cell.text : cell;
          return `<td${id ? ` data-td-cell-id="${id}"` : ""}>${text}</td>`;
        })
        .join("")}
    </tr>`;
    })
    .join("")}
    </tbody>`;
};

/**
 * Expect state to contain
 * columns: Array of strings (for header)
 * rows: Array of Arrays of strings (for each cell)
 * @returns {String}
 */
const Table = () => {
  return `<table class="table">
    <TableHeader />
    <TableBody />
</table>`;
};
