/*
 * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved.
 */

#include <nostalgia/core/gfx.hpp>

namespace nostalgia::core {

// map ASCII values to the nostalgia charset
constexpr ox::Array<char, 128> charMap = {
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,  // space
	38, // !
	0,  // "
	49, // #
	0,  // $
	0,  // %
	0,  // &
	0,  // '
	42, // (
	43, // )
	0,  // *
	0,  // +
	37, // ,
	0,  // -
	39, // .
	0,  // /
	27, // 0
	28, // 1
	29, // 2
	30, // 3
	31, // 4
	32, // 5
	33, // 6
	34, // 7
	35, // 8
	36, // 9
	40, // :
	0,  // ;
	0,  // <
	41, // =
	0,  // >
	0,  // ?
	0,  // @
	1,  // A
	2,  // B
	3,  // C
	4,  // D
	5,  // E
	6,  // F
	7,  // G
	8,  // H
	9,  // I
	10, // J
	11, // K
	12, // L
	13, // M
	14, // N
	15, // O
	16, // P
	17, // Q
	18, // R
	19, // S
	20, // T
	21, // U
	22, // V
	23, // W
	24, // X
	25, // Y
	26, // Z
	44, // [
	0,  // backslash
	45, // ]
	0,  // ^
	0,  // _
	0,  // `
	1,  // a
	2,  // b
	3,  // c
	4,  // d
	5,  // e
	6,  // f
	7,  // g
	8,  // h
	9,  // i
	10, // j
	11, // k
	12, // l
	13, // m
	14, // n
	15, // o
	16, // p
	17, // q
	18, // r
	19, // s
	20, // t
	21, // u
	22, // v
	23, // w
	24, // x
	25, // y
	26, // z
	46, // {
	51, // |
	48, // }
	50, // ~
};

void setBgTile(Context &ctx, uint_t bgIdx, int column, int row, unsigned tile, unsigned palBank) noexcept {
	setBgTile(ctx, bgIdx, column, row, {
		.tileIdx = tile,
		.palBank = palBank,
	});
}

ox::Error initConsole(Context &ctx) noexcept {
	constexpr ox::FileAddress TilesheetAddr = ox::StringLiteral("/TileSheets/Charset.ng");
	constexpr ox::FileAddress PaletteAddr = ox::StringLiteral("/Palettes/Charset.npal");
	setBgStatus(ctx, 0b0001);
	setBgCbb(ctx, 0, 0);
	oxReturnError(loadBgTileSheet(ctx, 0, TilesheetAddr));
	return loadBgPalette(ctx, 0, PaletteAddr);
}

void puts(
		Context &ctx,
		int const column,
		int const row,
		ox::CRStringView str) noexcept {
	auto const col = static_cast<uint_t>(column);
	for (auto i = 0u; i < str.bytes(); ++i) {
		setBgTile(
				ctx,
				0,
				static_cast<int>(col + i),
				row,
				static_cast<uint8_t>(charMap[static_cast<uint8_t>(str[i])]));
	}
}

}
