#pragma once

#include "M5GFX.h"

// STT may return simplified, traditional, or mixed Chinese. Keep the original
// transcript and use the traditional font only for glyphs absent from CN.
class TranscriptFont final : public lgfx::IFont {
public:
    void getDefaultMetric(lgfx::FontMetrics *metrics) const override {
        lgfx::fonts::efontCN_16.getDefaultMetric(metrics);
    }

    bool updateFontMetric(lgfx::FontMetrics *metrics, uint16_t code) const override {
        return lgfx::fonts::efontCN_16.updateFontMetric(metrics, code) ||
               lgfx::fonts::efontTW_16.updateFontMetric(metrics, code);
    }

    size_t drawChar(lgfx::LGFXBase *gfx, int32_t x, int32_t y, uint16_t code,
                    const lgfx::TextStyle *style, lgfx::FontMetrics *metrics,
                    int32_t &filled_x) const override {
        lgfx::FontMetrics probe;
        const lgfx::IFont &font = lgfx::fonts::efontCN_16.updateFontMetric(&probe, code)
            ? static_cast<const lgfx::IFont &>(lgfx::fonts::efontCN_16)
            : static_cast<const lgfx::IFont &>(lgfx::fonts::efontTW_16);
        return font.drawChar(gfx, x, y, code, style, metrics, filled_x);
    }
};
