// 拨打电话
import {i18n} from "@/locale";
import Config from "@/config";
import {dayjs} from "@/plugin";
import {useConfigStore} from "@/store";


// 缩略图
export function thumbnailImg(url: string, width = 400, height = 400) {
    if (!url || !url.startsWith("http") || !url.startsWith("https")) {
        return;
    }

    return url + `?x-oss-process=image/resize,m_fill,w_${width},h_${height}`;
}

// 转换webp
export function formatImgWebp(url: string, width = 400, height = 400) {
    if (!url || !url.startsWith("http") || !url.startsWith("https")) {
        return;
    }

    return url + `?x-oss-process=image/interlace,1/format,webp`;
}


// 拨打电话
export function callPhone(mobile: string) {
    console.log('mobile', mobile)

    if (!mobile) {
        return uni.showToast({
            title: i18n.global.t('common.prompt.phone-number-empty'),
            icon: 'none',
        })
    }

    // #ifdef APP-PLUS
    const configStore = useConfigStore()
    if (configStore.isIos) {
        uni.makePhoneCall({
            phoneNumber: mobile.trim(),
            fail(error) {
                console.error(error)
            },
        })
    } else {
        // 获取宿主上下文
        var main = plus.android.runtimeMainActivity();
        var Uri = plus.android.importClass("android.net.Uri");
        // 通过反射获取Android的Intent对象
        var Intent = plus.android.importClass("android.content.Intent");
        // 创建Intent，设置Action为ACTION_DIAL
        var intent = new Intent("android.intent.action.DIAL");
        // 设置要拨打的电话号码
        intent.setData(Uri.parse("tel:" + mobile));
        // 启动Intent
        main.startActivity(intent);
    }
    // #endif

    // #ifndef APP-PLUS
    uni.makePhoneCall({
        phoneNumber: mobile.trim(),
        fail(error) {
            console.error(error)
        },
    })
    // #endif
}

// 复制到剪切板
export function setClipboardData(data: string, showToast = true) {
    uni.setClipboardData({
        data,
        showToast: showToast,
        success: function () {
            uni.showToast({
                title: i18n.global.t('common.prompt.replication-successful'),
                icon: 'none',
            })
        },
    })
}


// 微信客服
export function loadWeixinService() {
    uni.navigateTo({
        url: `/pages/web-view/index?url=${Config.weixinServiceUrl}&title=${Config.weixinServiceName}`
    })
}

// 地图导航 latLng 例如：'31.1443439,121.808273'
export function navGoogleMap(latLng: string) {
    console.log('latLng', latLng)
    // 应用地址
    let url = ''
    // android 包名
    let pname = ''
    // ios id
    let appid: number
    if (plus.os.name == 'Android') {
        plus.nativeUI.actionSheet({
            title: i18n.global.t('common.select-maps-app'),
            cancel: i18n.global.t('common.cancel'),
            buttons: [{
                title: i18n.global.t('common.google-map')
            }]
        }, function (e) {
            switch (e.index) {
                case 1:
                    url = 'google.navigation:q=' + latLng
                    pname = 'com.android.vending'
            }
            if (url) {
                plus.runtime.openURL(url, function () {
                    plus.nativeUI.actionSheet({
                        title: i18n.global.t('common.app-marketplace'),
                        cancel: i18n.global.t('common.cancel'),
                        buttons: [{
                            title: i18n.global.t('common.app-marketplace')
                        }]
                    }, function ({
                                     index
                                 }) {
                        switch (index) {
                            case 1:
                                plus.runtime.openURL('market://details?id=' + pname,
                                    function () {
                                        plus.nativeUI.alert(i18n.global.t('common.prompt.installed-specified-app'));
                                    })
                        }
                    })
                });
            }
        });
    } else {
        plus.nativeUI.actionSheet({
            title: i18n.global.t('common.select-maps-app'),
            cancel: i18n.global.t('common.cancel'),
            buttons: [{
                title: i18n.global.t('common.google-map')
            }]
        }, function (e) {
            switch (e.index) {
                case 1:
                    url = 'comgooglemaps://?saddr=&daddr=' + latLng
                    appid = 585027354
            }
            if (url) {
                plus.runtime.launchApplication({action: url}, function (err) {
                    plus.nativeUI.actionSheet({
                        title: i18n.global.t('common.app-marketplace'),
                        cancel: i18n.global.t('common.cancel'),
                        buttons: [{
                            title: i18n.global.t('common.app-marketplace')
                        }]
                    }, function ({
                                     index
                                 }) {
                        switch (index) {
                            case 1:
                                plus.runtime.openURL(
                                    `itms-apps://itunes.apple.com/cn/app/id${appid}?mt=8')`,
                                    function () {
                                        plus.nativeUI.alert(i18n.global.t('common.prompt.installed-specified-app'));
                                    })
                        }
                    })
                });
            }
        });
    }
}

/**
 * 将时间戳格式化为 "MMM.DD YYYY" 格式（例如：Mar.06 2025）
 * @param {number} timestamp - 毫秒级时间戳
 * @returns {string} 格式化后的日期字符串
 */
export function formatTimestamp(timestamp: number): string {
    return dayjs(Number(timestamp))
        .format('MMM.DD YYYY') // 核心格式化指令
        .replace(/\b([a-z])/, match => match.toUpperCase()); // 确保月份首字母大写
}

/**
 * 将时间戳格式化为 "YYYY.MM.DD HH:mm 星期几" 格式
 * 星期几根据当前语言环境显示（中文：周一，英文：Mon）
 * 例如：2025.08.22 14:30 Fri 或 2025.08.22 14:30 周五
 * @param {number} timestamp - 毫秒级时间戳
 * @returns {string} 格式化后的日期时间字符串
 */
export function formatTimestampWithWeekday(timestamp: number): string {
    const locale = uni.getLocale()
    const date = dayjs(Number(timestamp))
    
    // 设置对应的语言环境
    if (locale === 'zh-Hans') {
        date.locale('zh-cn')
    } else {
        date.locale('en')
    }
    
    // 获取星期几的简写
    const weekdayShort = date.format('ddd')
    
    return `${date.format('YYYY.MM.DD HH:mm')} ${weekdayShort}`
}

/**
 * 将时间戳格式化为带月份名称的格式（如：June 3, 2025 12:25）
 * 根据当前语言环境显示中文或英文月份
 * @param {number} timestamp - 时间戳（毫秒）
 * @returns {string} 格式化后的时间字符串
 */
export function formatTimestampWithMonthName(timestamp: number): string {
    const locale = uni.getLocale()
    const date = dayjs(Number(timestamp))
    
    // 设置对应的语言环境
    if (locale === 'zh-Hans') {
        date.locale('zh-cn')
        // 中文格式：2025年6月3日 12:25
        return date.format('YYYY年M月D日 HH:mm')
    } else {
        date.locale('en')
        // 英文格式：June 3, 2025 12:25
        return date.format('MMMM D, YYYY HH:mm')
    }
}

/**
 * 将时间戳格式化为简短的月日时间格式（如：Jun 3 19:00）
 * 根据当前语言环境显示中文或英文月份
 * @param {number} timestamp - 时间戳（毫秒）
 * @returns {string} 格式化后的时间字符串
 */
export function formatTimestampShort(timestamp: number): string {
    const locale = uni.getLocale()
    const date = dayjs(Number(timestamp))
    
    // 设置对应的语言环境
    if (locale === 'zh-Hans') {
        date.locale('zh-cn')
        // 中文格式：6月3日 19:00
        return date.format('M月D日 HH:mm')
    } else {
        date.locale('en')
        // 英文格式：Jun 3 19:00
        return date.format('MMM D HH:mm')
    }
}

/**
 * 计算两个经纬度之间的球面距离（单位：英里）
 * @param {number} lat1 - 第一个点的纬度（十进制度）
 * @param {number} lon1 - 第一个点的经度（十进制度）
 * @param {number} lat2 - 第二个点的纬度（十进制度）
 * @param {number} lon2 - 第二个点的经度（十进制度）
 * @returns {number} 距离（英里）
 */
export function getDistanceInMiles(lat1: number, lon1: number, lat2: number, lon2: number): string {
    const toRad = (angle: number) => angle * Math.PI / 180;
    const R = 6371000; // 地球半径，单位：米
    const metersToMiles = 0.000621371; // 米到英里的转换系数

    const φ1 = toRad(lat1);
    const φ2 = toRad(lat2);
    const Δφ = toRad(lat2 - lat1);
    const Δλ = toRad(lon2 - lon1);

    const a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
        Math.cos(φ1) * Math.cos(φ2) *
        Math.sin(Δλ / 2) * Math.sin(Δλ / 2);

    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

    const meters = R * c;
    return (meters * metersToMiles).toFixed(2);
}

/**
 * 解析商家营业时间字符串
 * @param businessHours 营业时间字符串，格式如："MONDAY/TUESDAY/WEDNESDAY/THURSDAY/FRIDAY/SATURDAY/SUNDAY 05:00-16:00"
 * @returns 格式化后的营业时间，如："周一,周二,周三,周四,周五,周六,周日 05:00-16:00" 或 "Mon,Tue,Wed,Thu,Fri,Sat,Sun 05:00-16:00"
 */
export function parseBusinessHoursUtils(businessHours: string): string {
  if (!businessHours || !businessHours.trim()) {
    return '';
  }

  const locale = uni.getLocale()

  // 英文星期到中文和英文简写的映射
  const weekMapChinese: { [key: string]: string } = {
    'MONDAY': '周一',
    'TUESDAY': '周二', 
    'WEDNESDAY': '周三',
    'THURSDAY': '周四',
    'FRIDAY': '周五',
    'SATURDAY': '周六',
    'SUNDAY': '周日'
  };

  const weekMapEnglish: { [key: string]: string } = {
    'MONDAY': 'Mon',
    'TUESDAY': 'Tue', 
    'WEDNESDAY': 'Wed',
    'THURSDAY': 'Thu',
    'FRIDAY': 'Fri',
    'SATURDAY': 'Sat',
    'SUNDAY': 'Sun'
  };

  // 根据语言环境选择映射表
  const weekMap = locale === 'en' ? weekMapEnglish : weekMapChinese;
  const weekOrder = locale === 'en' 
    ? ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    : ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
  const separator = locale === 'en' ? '-' : '-';

  try {
    // 分割星期和时间部分
    const parts = businessHours.trim().split(' ');
    if (parts.length < 2) {
      return businessHours; // 格式不正确，返回原字符串
    }

    const weekPart = parts[0]; // 星期部分
    const timePart = parts.slice(1).join(' '); // 时间部分（可能有多个时间段）

    // 解析星期
    const weekDays = weekPart.split('/');
    const translatedWeeks = weekDays
      .map(day => weekMap[day.toUpperCase()])
      .filter(day => day); // 过滤掉无效的星期

    if (translatedWeeks.length === 0) {
      return businessHours; // 没有有效的星期，返回原字符串
    }

    // 处理连续的星期（如周一到周五）
    let weekString = '';
    if (translatedWeeks.length > 2) {
      // 检查是否为连续的星期
      const indices = translatedWeeks.map(week => weekOrder.indexOf(week)).filter(index => index !== -1);
      
      if (indices.length > 1) {
        indices.sort((a, b) => a - b);
        
        // 检查是否连续
        let isContinuous = true;
        for (let i = 1; i < indices.length; i++) {
          if (indices[i] !== indices[i-1] + 1) {
            isContinuous = false;
            break;
          }
        }
        
        if (isContinuous && indices.length > 2) {
          weekString = `${weekOrder[indices[0]]}${separator}${weekOrder[indices[indices.length - 1]]}`;
        } else {
          weekString = translatedWeeks.join(',');
        }
      } else {
        weekString = translatedWeeks.join(',');
      }
    } else {
      weekString = translatedWeeks.join(',');
    }

    return `${weekString} ${timePart}`;
  } catch (error) {
    console.error('解析营业时间出错:', error);
    return businessHours; // 出错时返回原字符串
  }
}

/**
 * 安全获取多语言文本并做占位符替换
 * - 不经过 t()
 * - 不触发 vue-i18n 插值
 * - 全平台稳定
 */
export function tWithParams(
    key: string,
    params: Record<string, any> = {}
) {
    const locale =
        typeof i18n.global.locale === 'string'
            ? i18n.global.locale
            : i18n.global.locale.value

    const messages = i18n.global.getLocaleMessage(locale)
    if (!messages) return key

    // 支持 a.b.c 深层 key
    let str: any = key.split('.').reduce((obj, k) => obj?.[k], messages)

    if (typeof str !== 'string') {
        // fallback：交给 i18n 自己处理
        return i18n.global.t(key, params)
    }

    // 使用 split + join（比正则更安全）
    Object.keys(params).forEach(k => {
        const val = params[k] ?? ''
        str = str.split(`{${k}}`).join(String(val))
    })

    return str
}