import { createElement, Fragment } from "preact";
import {
	CodeTableHeaders,
	SeverityTableHeaders,
	SeverityTableSummary,
} from "./SummaryTable";
import { table } from "../spectre.scss";
import {
	globalHeaders,
	summaryList,
	codes,
	deopts,
	ics,
	severityTable,
} from "./SummaryList.scss";

// TODO:
// - Consider putting each file into a Spectre Panel.
// - Consider using Panel tabs for each of the classifications. Maybe make the list a two column "field: value" list
//   but current header text is too big for Panel tabs

/**
 * @param {import('./Summary').SummaryProps} props
 */
export function SummaryList({ deoptInfo, perFileStats }) {
	return (
		<Fragment>
			<div class={globalHeaders}></div>
			<ul class={summaryList}>
				{Object.keys(perFileStats).map((fileName, i) => {
					const summaryInfo = perFileStats[fileName];

					return (
						<li key={fileName}>
							<div>
								<a href={`#/file/${i}`}>{deoptInfo[fileName].relativePath}</a>
							</div>
							<InlineSeverityTable
								class={codes}
								caption="Optimizations"
								severities={summaryInfo.codes}
								header={<CodeTableHeaders />}
							/>
							<InlineSeverityTable
								class={deopts}
								caption="Deoptimizations"
								severities={summaryInfo.deopts}
								header={<SeverityTableHeaders />}
							/>
							<InlineSeverityTable
								class={ics}
								caption="Inline Caches"
								severities={summaryInfo.ics}
								header={<SeverityTableHeaders />}
							/>
						</li>
					);
				})}
			</ul>
		</Fragment>
	);
}

function InlineSeverityTable(props) {
	return (
		<table class={[props.class, severityTable, table].join(" ")}>
			<caption>{props.caption}</caption>
			<thead>
				<tr>{props.header}</tr>
			</thead>
			<tbody>
				<tr>
					<SeverityTableSummary severities={props.severities} />
				</tr>
			</tbody>
		</table>
	);
}