import { type App } from "vue";

/**
 * 说明：页面导航相关函数封装。
 */

/**
 * 页面跳转: 后退至上一个页面。
 */
function back() {
  uni.navigateBack({ delta: 1 });
}
/**
 * 页面跳转: 后退并返回数据至上一个页面的 onPageBack 方法。
 * @param data 要返回的数据
 */
function backReturnData(data: Record<string, unknown>) {
  var pages = getCurrentPages(); // 获取页面栈
  var prevPage = pages[pages.length - 2] as { $vm: Record<string, unknown> }; // 上一个页面

  for (const key in data) {
    if (Object.prototype.hasOwnProperty.call(data, key)) {
      prevPage.$vm[key] = data[key];
    }
  }

  uni.navigateBack({ delta: 1 });
}
/**
 * 页面跳转: 关闭当前页面，跳转到应用内的某个页面
 * @param url 页面路径
 * @param data 要传递的数据
 */
function redirectTo(url: string, data: Record<string, unknown> = {}) {
  var dataString = '';

  for (const key in data) {
    if (Object.prototype.hasOwnProperty.call(data, key) && data[key] !== undefined && data[key] !== null)
      dataString += `&${key}=${data[key]}`;
  }

  uni.redirectTo({ 
    url: url + (url.includes('?') ? '&' : '?') + dataString,
    fail: (err) => {
      console.error('页面跳转失败:', err);
    },
  });
}
/**
 * 页面跳转: 跳转到指定页面
 * @param url 页面路径
 * @param data 要传递的数据
 */
function navTo(url: string, data: Record<string, unknown> = {}) {
  var dataString = '';
  
  if (Array.isArray(url)) {
    data = url[1]
    url = url[0]
  }
  for (const key in data) {
    const d = data[key]
    if (d !== undefined && d !== null)
      dataString += `&${key}=${encodeURIComponent('' + d)}`;
  }

  uni.navigateTo({ 
    url: url + (url.includes('?') ? '&' : '?') + dataString,
    fail: (err) => {
      console.error('页面跳转失败:', err);
    },
  });
}
/**
 * 页面数据传递: 调用上一个页面的 onPageBack 方法
 * @param name 方法名
 * @param data 要传递的数据
 */
function callPrevOnPageBack(name: string, data: Record<string, unknown>) {
  var pages = getCurrentPages(); // 获取页面栈
  var prevPage = pages[pages.length - 2] as { $vm: Record<string, unknown> }; // 上一个页面

  if (typeof prevPage.$vm.onPageBack === 'function')
    prevPage.$vm.onPageBack(name, data);
}
/**
 * 页面跳转: 调用上一个页面的 onPageBack 方法并返回至上一个页面
 * @param name 方法名
 * @param data 要传递的数据
 */
function backAndCallOnPageBack(name: string, data: Record<string, unknown>) {
  var pages = getCurrentPages(); // 获取页面栈
  var prevPage = pages[pages.length - 2] as { $vm: Record<string, unknown> }; // 上一个页面

  if (typeof prevPage.$vm.onPageBack === 'function')
    prevPage.$vm.onPageBack(name, data);

  uni.navigateBack({ delta: 1 });
}

function isTopLevelPage() {
  // 获取当前页面栈
  const pages = getCurrentPages();
  
  if (!pages || pages.length === 0) {
    return false; // 极端情况，没有页面
  }

  // 当前页面实例
  const currentPage = pages[pages.length - 1];
  
  // 判断当前页面是否是栈中的第一个页面 (索引为 0)
  // 注意：pages[0] 通常是 tabBar 页面或启动页
  return pages.length === 1 || currentPage === pages[0];
}


export {
  redirectTo,
  back,
  backReturnData,
  backAndCallOnPageBack, 
  navTo,
  callPrevOnPageBack,
  isTopLevelPage,
}

export function getCurrentPageUrl() {
  const pages = getCurrentPages();
  const currentPagePath = pages[pages.length - 1]?.route
  return currentPagePath
}

export default {
  install(app: App<Element>) : void {
    const p = {
      redirectTo,
      back,
      backReturnData,
      backAndCallOnPageBack,
      callPrevOnPageBack,
      navTo,
    };
    app.config.globalProperties.$p = p;
  },
}