const Hyprland = await Service.import('hyprland');
const { Icon, Label } = Widget;

import HoverRevealer from './hover-revealer.ts';

const DEFAULT_KB = 'at-translated-set-2-keyboard';

// Types
import { Keyboard, LabelGeneric } from 'global-types';


const getKbdLayout = (self: LabelGeneric, _: string, layout: string) => {
    if (layout) {
        if (layout === 'error') {
            return;
        }

        const shortName = layout.match(/\(([A-Za-z]+)\)/);

        self.label = shortName ? shortName[1] : layout;
    }
    else {
        // At launch, kb layout is undefined
        Hyprland.messageAsync('j/devices').then((obj) => {
            const keyboards = Array.from(JSON.parse(obj)
                .keyboards) as Keyboard[];
            const kb = keyboards.find((v) => v.name === DEFAULT_KB);

            if (kb) {
                layout = kb.active_keymap;

                const shortName = layout
                    .match(/\(([A-Za-z]+)\)/);

                self.label = shortName ? shortName[1] : layout;
            }
            else {
                self.label = 'None';
            }
        }).catch(print);
    }
};

export default () => HoverRevealer({
    class_name: 'keyboard',
    spacing: 4,

    icon: Icon({
        icon: 'input-keyboard-symbolic',
        size: 20,
    }),
    label: Label({ css: 'font-size: 20px;' })
        .hook(Hyprland, getKbdLayout, 'keyboard-layout'),
});