import { inject } from 'vue';
import type { Component, InjectionKey } from 'vue';

export interface KviewUiMessages {
    alert: {
        info: string;
        success: string;
        warning: string;
        error: string;
        dismiss: string;
    };
    common: {
        back: string;
        cancel: string;
        confirm: string;
        loading: string;
        required: string;
        save: string;
        saving: string;
    };
    confirm: {
        title: string;
        message: string;
    };
    navigation: {
        breadcrumb: string;
        groupedActions: string;
        section: string;
        segmentedControl: string;
    };
    toast: {
        success: string;
        error: string;
        warning: string;
        info: string;
        dismiss: string;
        working: string;
        pleaseWait: string;
        complete: string;
        completedMessage: string;
        failed: string;
        failedMessage: string;
    };
}

export interface KviewUiMessageOverrides {
    alert?: Partial<KviewUiMessages['alert']>;
    common?: Partial<KviewUiMessages['common']>;
    confirm?: Partial<KviewUiMessages['confirm']>;
    navigation?: Partial<KviewUiMessages['navigation']>;
    toast?: Partial<KviewUiMessages['toast']>;
}

export type KviewResourceIconMap = Readonly<Record<string, string>>;

export interface KviewUiSerializedContext {
    messages: KviewUiMessages;
    resourceIcons: KviewResourceIconMap;
}

export interface KviewUiContext extends KviewUiSerializedContext {
    linkComponent: Component | null;
}

export const defaultKviewUiMessages: KviewUiMessages = Object.freeze({
    alert: Object.freeze({
        info: 'Info',
        success: 'Success',
        warning: 'Warning',
        error: 'Error',
        dismiss: 'Dismiss alert',
    }),
    common: Object.freeze({
        back: 'Back',
        cancel: 'Cancel',
        confirm: 'Confirm',
        loading: 'Loading',
        required: 'required',
        save: 'Save',
        saving: 'Saving...',
    }),
    confirm: Object.freeze({
        title: 'Confirm action',
        message: 'Are you sure you want to continue?',
    }),
    navigation: Object.freeze({
        breadcrumb: 'Breadcrumb',
        groupedActions: 'Grouped actions',
        section: 'Section navigation',
        segmentedControl: 'Segmented control',
    }),
    toast: Object.freeze({
        success: 'Success',
        error: 'Error',
        warning: 'Warning',
        info: 'Info',
        dismiss: 'Dismiss notification',
        working: 'Working',
        pleaseWait: 'Please wait...',
        complete: 'Complete',
        completedMessage: 'The action completed successfully.',
        failed: 'Something went wrong',
        failedMessage: 'The action could not be completed.',
    }),
});

const defaultKviewResourceIcons: KviewResourceIconMap = Object.freeze({});

export const defaultKviewUiContext: KviewUiContext = Object.freeze({
    messages: defaultKviewUiMessages,
    resourceIcons: defaultKviewResourceIcons,
    linkComponent: null,
});

export const kviewUiContextKey: InjectionKey<KviewUiContext> = Symbol('KviewUiContext');

export const mergeKviewUiMessages = (
    overrides: KviewUiMessageOverrides = {},
): KviewUiMessages => ({
    alert: {
        ...defaultKviewUiMessages.alert,
        ...overrides.alert,
    },
    common: {
        ...defaultKviewUiMessages.common,
        ...overrides.common,
    },
    confirm: {
        ...defaultKviewUiMessages.confirm,
        ...overrides.confirm,
    },
    navigation: {
        ...defaultKviewUiMessages.navigation,
        ...overrides.navigation,
    },
    toast: {
        ...defaultKviewUiMessages.toast,
        ...overrides.toast,
    },
});

export const useKviewUi = (): KviewUiContext => inject(
    kviewUiContextKey,
    defaultKviewUiContext,
);
