import dayjs from 'dayjs';

export type TargetContext = '_self' | '_parent' | '_blank' | '_top';

export interface OpenWindowOptions {
  target?: TargetContext;

  [key: string]: any;
}

// 新窗口打开处理函数
export function openWindow(url: string, opts?: OpenWindowOptions) {
  const { target = '_blank', ...others } = opts || {};

  const queryString = Object.entries(others)
    .filter(([key, value]) => value !== undefined && value !== null)
    .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
    .join('&');

  // 构造带查询参数的完整 URL
  const fullUrl = queryString ? `${url}${url.includes('?') ? '&' : '?'}${queryString}` : url;

  window.open(fullUrl, target);
}

/**
 * @description 获取localStorage
 * @param {String} key Storage名称
 * @returns {String}
 */
export function localGet(key: string) {
  const value = window.localStorage.getItem(key);
  try {
    return JSON.parse(window.localStorage.getItem(key) as string);
  } catch (error) {
    return value;
  }
}

/**
 * @description 存储localStorage
 * @param {String} key Storage名称
 * @param {*} value Storage值
 * @returns {void}
 */
export function localSet(key: string, value: any) {
  window.localStorage.setItem(key, JSON.stringify(value));
}

/**
 * @description 清除localStorage
 * @param {String} key Storage名称
 * @returns {void}
 */
export function localRemove(key: string) {
  window.localStorage.removeItem(key);
}

/**
 * @description 清除所有localStorage
 * @returns {void}
 */
export function localClear() {
  window.localStorage.clear();
}

/**
 * 从URL中获取查询参数
 * @param url - 要解析的URL
 * @param key - 要获取的参数名，如果不传则返回所有参数
 * @returns 返回指定参数的值或所有参数对象
 */
export function getUrlParams(url: string, key?: string): Record<string, string> | string | object | null {
  try {
    const urlObj = new URL(url, window.location.origin);
    const params = new URLSearchParams(urlObj.search);

    if (key) {
      return params.get(key);
    }

    const result: Record<string, string> = {};
    params.forEach((value, key) => {
      result[key] = value;
    });

    return result;
  } catch (error) {
    console.error('解析URL失败:', error);
    return key ? null : {};
  }
}

// 格式化实例类型
export function formatInstanceType(value: string): string {
  switch (value) {
    case 'MANUAL':
      return '运行应用';
    case 'MANUAL_SUB':
      return '运行子流程';
    case 'TIMER':
      return '定时任务';
    default:
      return value;
  }
}

export function formatInstanceStatus(value: string): string {
  switch (value) {
    case 'RUNNING':
      return '运行中';
    case 'STOPPED':
      return '已停止';
    case 'STARTING':
      return '启动中';
    case 'STOPPING':
      return '停止中';
    case 'DELETING':
      return '删除中';
    case 'DELETED':
      return '已删除';
    case 'PAUSED':
      return '暂停';
    case 'FAILURE':
      return '失败';
    case 'SUCCESS':
      return '成功';
    default:
      return value;
  }
}

//格式化时间戳
export function formatTimestamp(timestamp: number): string {
  // 判断时间戳是秒级还是毫秒级
  const isMillisecond = timestamp.toString().length >= 13;
  const millisecondTimestamp = isMillisecond ? timestamp : timestamp * 1000;
  return dayjs(millisecondTimestamp).format('YYYY-MM-DD HH:mm:ss');
}

// 格式化数据类型
export function formatDataType(value: string): string {
  const dataTypeAbbr = new Map([
    ['INTEGER', 'INT'],
    ['STRING', 'STR'],
    ['FLOAT', 'FLOAT'],
    ['DOUBLE', 'DOU'],
    ['ARRAY', 'ARR'],
    ['BOOLEAN', 'BOOL'],
    ['OBJECT', 'OBJECT'],
    ['DATE', 'DATE'],
    ['DATETIME', 'DT'],
    ['TIMESTAMP', 'TS'],
    ['JSON', 'JSON']
  ]);

  return dataTypeAbbr.get(value) || value;
}

// 判断是否为JSON字符串
export function isJSON(str: any): boolean {
  if (typeof str !== 'string') return false;
  try {
    JSON.parse(str);
    return true;
  } catch (e) {
    return false;
  }
}

// 秒数转化为时分秒，返回中文字符串
export function formatSeconds(value: string) {
  let secondTime = parseInt(value, 10); // 秒
  let minuteTime = 0; // 分
  let hourTime = 0; // 小时
  if (secondTime > 59) {
    // 如果秒数大于60，将秒数转换成整数
    // 获取分钟，除以60取整数，得到整数分钟
    minuteTime = parseInt(`${secondTime / 60}`, 10);
    // 获取秒数，秒数取余，得到整数秒数
    secondTime = parseInt(`${secondTime % 60}`, 10);
    // 如果分钟大于60，将分钟转换成小时
    if (minuteTime > 59) {
      // 获取小时，获取分钟除以60，得到整数小时
      hourTime = parseInt(`${minuteTime / 60}`, 10);
      // 获取小时后取余的分，获取分钟除以60取余的分
      minuteTime = parseInt(`${minuteTime % 60}`, 10);
    }
  }
  let result = '';
  if (secondTime > 0) {
    result = `${parseInt(`${secondTime}`, 10)}秒`;
  }
  if (minuteTime > 0) {
    result = `${parseInt(`${minuteTime}`, 10)}分${result}`;
  }
  if (hourTime > 0) {
    result = `${parseInt(`${hourTime}`, 10)}小时${result}`;
  }
  return result;
}

/**
 * 通用反序列化方法，用于处理可能为JSON格式的字符串
 * @param value - 需要反序列化的值
 * @returns 如果是有效JSON则返回解析后的对象，否则返回原值
 */
export const deserializeValue = (value: any): any => {
  // 如果不是字符串类型，直接返回原值
  if (typeof value !== 'string') {
    return value;
  }

  // 如果是空字符串，返回原值
  if (value === '') {
    return value;
  }

  // 尝试解析JSON
  try {
    // 检查是否为有效的JSON格式
    if (isJSON(value)) {
      return JSON.parse(value);
    }
    // 不是JSON格式，返回原值
    return value;
  } catch (error) {
    // 解析失败，返回原值
    console.warn('Failed to deserialize value:', value, error);
    return value;
  }
};