import { App } from 'vue';
import { ELanguageLocale } from '@/UI-kit/types';

const MonthsName: Record<string, Record<string, string>> = {
    [ELanguageLocale.RU]: {
        '01': 'января',
        '02': 'февраля',
        '03': 'марта',
        '04': 'апреля',
        '05': 'мая',
        '06': 'июня',
        '07': 'июля',
        '08': 'августа',
        '09': 'сентября',
        10: 'октября',
        11: 'ноября',
        12: 'декабря',
    },
    [ELanguageLocale.UZ]: {
        '01': 'январ',
        '02': 'феврал',
        '03': 'март',
        '04': 'апрел',
        '05': 'май',
        '06': 'июн',
        '07': 'июл',
        '08': 'август',
        '09': 'сентябр',
        10: 'октябр',
        11: 'ноябр',
        12: 'декабр',
    },
    [ELanguageLocale.KG]: {
        '01': 'январдын',
        '02': 'февралдын',
        '03': 'марттын',
        '04': 'апрелдин',
        '05': 'майдын',
        '06': 'июндун',
        '07': 'июлдун',
        '08': 'августтун',
        '09': 'сентябрдын',
        10: 'октябрдын',
        11: 'ноябрдын',
        12: 'декабрдын',
    },
    [ELanguageLocale.TJ]: {
        '01': 'январи',
        '02': 'феврали',
        '03': 'марти',
        '04': 'апрели',
        '05': 'маи',
        '06': 'июни',
        '07': 'июли',
        '08': 'августи',
        '09': 'сентябри',
        10: 'октябри',
        11: 'ноябри',
        12: 'декабри',
    },
};

export default {
    install(app: App) {
        function getDate(value: string) {
            const date = new Date(value);
            const day: string = date.getDate().toString().padStart(2, '0');
            const month: string = (date.getMonth() + 1).toString().padStart(2, '0');
            const hour = date.getHours() > 9 ? date.getHours() : '0' + date.getHours();
            const minutes = date.getMinutes() > 9 ? date.getMinutes() : '0' + date.getMinutes();

            return {
                date,
                day,
                month,
                hour,
                minutes,
            };
        }

        /**
         * Форматирование даты из ISO в человеческий
         *
         * @param {string} value - дата в ISO формате
         * @param {boolean} time - нужно ли выводить время?
         * @param {boolean} isDate - нужно ли выводить дату?
         * @param {ru|uz|kg|tj} lang - язык
         * @returns {string} formattedString
         */
        function formatDateWithWordMonth(
            value: string,
            time = false,
            isDate = false,
            lang: ELanguageLocale = ELanguageLocale.RU,
        ) {
            if (!value) {
                return '';
            }

            const { date, day, month, hour, minutes } = getDate(value);
            const monthName = MonthsName[lang][month];

            let result = '';

            switch (lang) {
                case ELanguageLocale.UZ:
                    // "9 сентябр 2020 йил соат 14:30"
                    result =
                        Number(day) +
                        ' ' +
                        monthName +
                        (isDate ? ' ' + date.getFullYear() + ' йил' : '') +
                        (time ? ' соат ' + hour + ':' + minutes : '');
                    break;

                case ELanguageLocale.KG:
                    // "9 сентябр 2020-жылы саат 14:30"
                    result =
                        Number(day) +
                        ' ' +
                        monthName +
                        (isDate ? ' ' + date.getFullYear() + '-жылы' : '') +
                        (time ? ' саат ' + hour + ':' + minutes : '');
                    break;

                case ELanguageLocale.TJ:
                    // "9 сентябр соли 2020 соати 14:30"
                    result =
                        Number(day) +
                        ' ' +
                        monthName +
                        (isDate ? ' соли ' + date.getFullYear() : '') +
                        (time ? ' соати ' + hour + ':' + minutes : '');
                    break;

                default:
                    // Русский: "9 сентября 2020"
                    result =
                        Number(day) +
                        ' ' +
                        monthName +
                        (isDate ? ' ' + date.getFullYear() : '') +
                        (time ? ' в ' + hour + ':' + minutes : '');
            }

            return result;
        }

        /**
         * Форматирование даты из ISO в человеческий
         *
         * @param {string} value - дата в ISO формате
         * @param {boolean} time - нужно ли выводить время?
         * @returns {string} formattedString
         */
        function formatDate(value: string, time = false) {
            if (value) {
                const { date, day, month, hour, minutes } = getDate(value);
                return (
                    day +
                    '.' +
                    month +
                    '.' +
                    date.getFullYear() +
                    (time ? ' ' + hour + ':' + minutes : '')
                );
            }
            return '';
        }

        /**
         * Форматирование даты из ISO в человеческий
         *
         * @param {string} value - дата в ISO формате
         * @param {boolean} time - нужно ли выводить время?
         * @returns {string} formattedString
         */
        function formatServerDate(value: string) {
            return formatDate(value).split('.').reverse().join('-');
        }

        //
        // * Перевод числа в формат 1 000 000,00
        // *
        // * @param {string | number} value - число
        // * @returns {string} formattedAmount
        //
        function formatAmount(value: string | number) {
            if (typeof value === 'number') {
                value = value.toString();
            }
            if (value) {
                if (value.toString().includes('.')) {
                    /** округляем до сотых */
                    value = parseFloat(value).toFixed(2).toString();
                }

                let result = '';
                const isFloat: number = value.indexOf('.');
                if (isFloat > 0) {
                    result = ',' + value.substring(isFloat + 1);
                    value = value.slice(0, isFloat);
                }

                if (value.length - 1 < 3) {
                    return value + result;
                }

                let index: number = value.length;
                while (index > 0) {
                    /** добавляем непереносимый пробел ($nbsp;) */
                    result = '\u00A0' + value.substring(index - 3, index) + result;
                    index = index - 3;
                }

                return result.trim();
            }
            return value;
        }

        function formatPhone(value: string) {
            if (value.slice(0, 2) === '79') {
                value = `+${value}`;
            }

            const match: any = value.match(/(\+7|8)(\d{3})(\d{3})(\d{2})(\d{2})/);
            if (!match) {
                return value;
            }

            return match[1] + ' (' + match[2] + ') ' + match[3] + '-' + match[4] + '-' + match[5];
        }

        app.config.globalProperties.$formatters = {
            getDate,
            formatDate,
            formatDateWithWordMonth,
            formatServerDate,
            formatAmount,
            formatPhone,
        };
    },
};
