<script lang="ts">
	import { resolve } from '$app/paths';
	import Skill from '$lib/Skill.svelte';
	import Sec from '../Sec.svelte';
	import * as skill from '$lib/data/skill';
	import { onMount } from 'svelte';
	import type { ClassValue } from 'svelte/elements';

	import courseSetupHoriz from './course-setup.horiz.png';
	import courseSetupVert from './course-setup.vert.png';
	import umaSetupHoriz from './uma-setup.horiz.png';
	import umaSetupVert from './uma-setup.vert.png';
	import resultsChart from './results-chart.png';
	import resultsHoriz from './results.horiz.png';
	import resultsVert from './results.vert.png';
	import Article from '../Article.svelte';

	let allSkillsList: skill.Skill[] = $state([]);
	onMount(async () => {
		allSkillsList = await skill.skills();
	});
	const allSkills = $derived(allSkillsList.reduce((m, s) => m.set(s.skill_id, s), new Map<number, skill.Skill>()));
	const skills = $derived({
		goldpp: allSkills.get(200451),
		pp: allSkills.get(200452),
		ttl: allSkills.get(200531),
		earlyLead: allSkills.get(200532),
		dd: allSkills.get(201262),
		gw: allSkills.get(201601),
		ignitedWIT: allSkills.get(210052),
	});

	const locations = [
		['札幌', 'Sapporo'],
		['函館', 'Hakodate'],
		['新潟', 'Niigata'],
		['福島', 'Fukushima'],
		['中山', 'Nakayama'],
		['東京', 'Tokyo'],
		['中京', 'Chukyo'],
		['京都', 'Kyoto'],
		['阪神', 'Hanshin'],
		['小倉', 'Kokura'],
		['大井', 'Ooi'],
		['川崎', 'Kawasaki'],
		['船橋', 'Funabashi'],
		['盛岡', 'Morioka'],
	] as const;
	const courseinfos = [
		['芝', 'Turf'],
		['ダート', 'Dirt'],
		['内', 'Inner'],
		['外', 'Outer'],
	] as const;
	const conditionses = [
		['良', 'Firm'],
		['稍重', 'Good'],
		['重', 'Soft'],
		['不良', 'Heavy'],
	] as const;
	const styles = [
		['大逃げ', 'Runaway'],
		['逃げ', 'Front Runner'],
	] as const;
	const moods = [
		['絶好調', 'Great'],
		['好調', 'Good'],
		['普通', 'Normal'],
		['不調', 'Bad'],
		['絶不調', 'Awful'],
	] as const;
	const accels = [
		['地固め', 'Groundwork'],
		['盤石', 'Unshakable Stance'],
		['先駆け', 'Early Lead'],
		['先手', 'Taking the Lead'],
		['進化先手', 'Evolved Taking the Lead'],
	] as const;
	const arinashi = [
		['あり', 'Enabled'],
		['なし', 'Disabled'],
	] as const;
	const hills = [
		['上り坂 (Red)', 'Uphill'],
		['下り坂 (Blue)', 'Downhill'],
	] as const;
	const times = [
		['危険回避', 'Dodging Danger'],
		['スキル', 'Lane Skill Activation'],
		['中盤', 'Mid Race'],
	] as const;
	const straco = [
		['直線 (Yellow)', 'Straight'],
		['コーナー (Pink)', 'Corner'],
	] as const;
	const laneskills = [
		['スキルなし', 'No Skills'],
		['危険回避のみ', 'Dodging Danger'],
		['+注目の踊り子', 'DD + Center Stage'],
		['+ポジションセンス', 'DD + Prudent Positioning'],
		['+アオハル点火・賢', 'DD + Ignited Spirit WIT'],
	] as const;
	const tooltip = [
		['時間', 'Time (s)'],
		['レーン', 'Lane (CW)'],
		['走行距離', 'Distance (m)'],
		['距離ロス', 'Distance Loss (m)'],
	] as const;
	const summaryText = [
		['バ身', 'Lengths'],
		['アド', 'Add'],
		['ロス', 'Loss'],
	] as const;
</script>

{#snippet transbody(heads: string | [string, string], cells: ReadonlyArray<readonly [string, string]>, cls?: ClassValue | null)}
	<table class={['mx-1 mt-4 table-fixed border md:mb-auto', cls]}>
		{#if typeof heads === 'string'}
			<caption class="border border-b-0">{heads}</caption>
		{:else}
			<thead class="border-b">
				<tr>
					<th class="w-1/2 px-2" scope="col">{heads[0]}</th>
					<th class="w-1/2 px-2" scope="col">{heads[1]}</th>
				</tr>
			</thead>
		{/if}
		<tbody>
			{#each cells as [jp, en] (jp)}
				<tr class="even:bg-mist-300 dark:even:bg-mist-900">
					<td>{jp}</td>
					<td>{en}</td>
				</tr>
			{/each}
		</tbody>
	</table>
{/snippet}

<Article>
	{#snippet head()}
		<Sec h={1} id="top" class="text-center pointer-coarse:mb-8">Gaikokujin's Guide to Lanecalc</Sec>
		<p>
			This is an English usage manual for <a href="https://lanecalc.hf-uma.net/" target="_blank" rel="noopener noreferrer"
				>危険回避シミュ</a
			>, or Lanecalc.
		</p>
		<p>
			Lanecalc is a precise calculator for the effect of <a href={resolve('/doc/frbm#lane-combo')}>lane combo</a>, the use of <Skill
				skill={skills.dd}
			/> along with some combination of <Skill skill={skills.pp} />, <Skill skill={skills.goldpp} />, and <Skill
				skill={skills.ignitedWIT}
			/>
			for a substantial speed boost in early race. Lanecalc helps with deciding whether lane combo (and DD alone) is applicable to a
			given track.
		</p>
		<p>
			The translations presented in this manual are contextualized to an English speaker using Lanecalc, rather than being direct
			translations. E.g., スキル literally means "skill," but I am translating it as "lane skill activation time" where that is
			what スキル signifies.
		</p>
	{/snippet}

	<Sec h={2} id="course">Course Setup</Sec>
	<p>
		The top section of lane calc is the course setup section. Set the race location, course at the location, and ground condition
		here.
	</p>
	<a href={courseSetupHoriz}>
		<picture>
			<source srcset={courseSetupHoriz} media="(orientation: landscape)" width="882" height="111" />
			<img
				class="mx-auto"
				src={courseSetupVert}
				width="412"
				height="214"
				alt="Lanecalc's course setup section with English labels"
			/>
		</picture>
	</a>
	<div class="mb-4 grid grid-cols-1 text-center text-xl md:grid-cols-3">
		{@render transbody(['レース場', 'Location'], locations)}
		{@render transbody(['コース', 'Race Course'], courseinfos)}
		{@render transbody(['バ場状態', 'Conditions'], conditionses)}
	</div>
	<p>
		The race course menu shows only courses available at the selected race location. Changing the location will reset the course.
	</p>

	<Sec h={2} id="uma">Uma Setup</Sec>
	<p>The next section is the setup for the Uma.</p>
	<a href={umaSetupHoriz}>
		<picture>
			<source srcset={umaSetupHoriz} media="(orientation: landscape)" width="878" height="218" />
			<img class="mx-auto" src={umaSetupVert} width="412" height="456" alt="Lanecalc's Uma setup section with English labels" />
		</picture>
	</a>
	<div class="mb-4 grid grid-cols-1 text-center text-xl md:grid-cols-3">
		{@render transbody(['脚質', 'Running Style'], styles)}
		{@render transbody(['ポワー', 'Power'], [])}
		{@render transbody(['調子', 'Mood'], moods)}
		{@render transbody(['ウマ番', 'Gate'], [])}
		{@render transbody(['危険回避発動', 'Dodging Danger'], arinashi)}
		{@render transbody(['横ブロック', 'Side Block'], arinashi)}
		{@render transbody(['レーンスキル発動位置', 'Lane Skill Activation Time'], [['秒', 'seconds']])}
		{@render transbody(['加速スキル', 'Acceleration Skills'], accels, 'md:col-span-2')}
	</div>
	<p>
		Power should be entered as the raw power stat, i.e. the number shown on your Uma's stat screen. (There doesn't appear to be a
		way to apply power passives.)
	</p>
	<p>
		Unshakable Stance is the gold version of <Skill skill={skills.gw} mention /> and is not yet available in Global. "Evolved Taking
		the Lead" means any of the evolutions of <Skill skill={skills.ttl} mention /> that turn it into a 0.5 accel skill. (Aston Machan
		will have a TTL evolution that instead turns it into a 4s 0.4 accel. There doesn't appear to be a way to apply it in the calculator.)
	</p>
	<p>
		Selecting another skill in the same group as a selected one will remove the existing skill. Selecting an already selected
		skill will disable it entirely in the simulator.
	</p>

	<Sec h={2} id="chart">Results Chart</Sec>
	<p>Once the course and Uma are configured, click the green 計算 button. After a moment, the results appear.</p>
	<a href={resultsChart}>
		<picture>
			<img class="mx-auto" src={resultsChart} width="800" height="600" alt="Lanecalc results chart" />
		</picture>
	</a>
	<p class="mt-4">
		The chart shows the Uma's simulated lane (horizontal distance from the rail) and forward velocity under the effects of various
		lane combo skills.
	</p>
	<p>
		The example above is Hanshin 2200, firm, with a front runner with 1200 power in great condition from gate 6. She has <Skill
			skill={skills.gw}
			mention
		/> and <Skill skill={skills.earlyLead} mention />, and the lane change speed skills are set to activate at 7 seconds.
	</p>
	<div class="-mt-4 mb-4 grid grid-cols-1 text-center text-xl md:grid-cols-6">
		{@render transbody('Hill Indicators', hills, 'md:col-span-2')}
		{@render transbody('Time Indicators', times, 'md:col-span-2')}
		{@render transbody('Straights/Corners', straco, 'md:col-span-2')}
		{@render transbody('Lane Speed Skills', laneskills, 'md:col-span-4 md:col-start-2')}
	</div>
	<p>
		You can click the labels underneath the chart to hide the corresponding line. The top row is for lane position lines, and the
		bottom row is for velocity lines.
	</p>
	<p>
		You can also hover the mouse over the lines for details. The first portion of the details are the skills that produce the
		exact corresponding point, with a color square for each. Underneath is the simulation state.
	</p>
	<div class="-mt-4 mb-4 grid grid-cols-1 text-center text-xl md:grid-cols-3">
		{@render transbody('Hover Info', tooltip, 'md:col-start-2')}
	</div>

	<Sec h={2} id="summary">Results Summary</Sec>
	<p>
		Last is the summary, shown as circles showing the gain from each combination of skills:
		<Skill skill={skills.dd} /> alone, DD plus <Skill skill={skills.goldpp} />, DD plus <Skill skill={skills.pp} />, and DD plus <Skill
			skill={skills.ignitedWIT}
		/>.
	</p>
	<a href={resultsHoriz}>
		<picture>
			<source srcset={resultsHoriz} media="(orientation: landscape)" width="700" height="176" />
			<img class="mx-auto" src={resultsVert} width="380" height="703" alt="Lanecalc results summary" />
		</picture>
	</a>
	<div class="mb-4 grid grid-cols-1 text-center text-xl md:grid-cols-3">
		{@render transbody('Lane Speed Skills', laneskills.slice(1), 'md:col-span-2')}
		{@render transbody('Labels', summaryText)}
	</div>
</Article>
