// 定义消息类型
type MessageType = 'success' | 'error' | 'default' | 'warning' | 'info';

// 定义消息配置接口
interface MessageConfig {
  content: string;
  type?: MessageType;
  duration?: number;
}

// 定义消息返回接口
interface MessageInstance {
  close: () => void;
}

// 消息容器样式
const containerStyle = `
  position: fixed;
  top: 20px;
  right: 20px;
  z-index: 9999;
  display: flex;
  flex-direction: column;
  gap: 8px;
`;

// 消息基础样式
const baseMessageStyle = `
  padding: 12px 16px;
  border-radius: 4px;
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 300px;
  max-width: 500px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  transition: all 0.3s ease;
  opacity: 0;
  transform: translateX(100%);
  word-break: break-word;
`;

// 成功消息样式
const successStyle = `
  ${baseMessageStyle}
  background-color: #f0f9eb;
  border-left: 4px solid #52c41a;
  color: #1f6d31;
`;

// 警告消息样式
const warningStyle = `  ${baseMessageStyle}  background-color: #fffbe6;
  border-left: 4px solid #faad14;
  color: #d48806;`;

// 错误消息样式
const errorStyle = `
  ${baseMessageStyle}
  background-color: #fff2f0;
  border-left: 4px solid #ff4d4f;
  color: #b3261e;
`;

// 信息消息样式
const infoStyle = `
  ${baseMessageStyle}
  background-color: #e6f7ff;
  border-left: 4px solid #1890ff;
  color: #0c5460;
`;

// 默认消息样式
const defaultStyle = `
  ${baseMessageStyle}
  background-color: #f0f2f5;
  border-left: 4px solid #1890ff;
  color: #1890ff;
`;

// 图标样式
const iconStyle = `
  font-size: 16px;
`;

// 消息容器
let container: HTMLDivElement | null = null;
let messageCount = 0;

// 创建消息容器
function createContainer(): void {
  if (container) return;

  container = document.createElement('div');
  container.style.cssText = containerStyle;
  document.body.appendChild(container);
}

// 创建图标元素
function createIcon(type: MessageType): HTMLSpanElement {
  const icon = document.createElement('span');
  icon.style.cssText = iconStyle;

  switch(type) {
    case 'success':
      icon.innerHTML = '✓'; // 成功图标
      break;
    case 'error':
      icon.innerHTML = '✕'; // 错误图标
      break;
    case 'warning':
      icon.innerHTML = '⚠'; // 警告图标
      break;
    case 'info':
      icon.innerHTML = 'ℹ'; // 信息图标
      break;
    default:
      icon.innerHTML = 'i'; // 信息图标
  }

  return icon;
}

// 显示消息
function showMessage(
  content: string,
  type: MessageType = 'default',
  duration: number = 3000
): MessageInstance {
  createContainer();

  // 创建消息元素
  const messageId = `message-${Date.now()}-${messageCount++}`;
  const messageEl = document.createElement('div');
  messageEl.id = messageId;

  // 设置样式
  switch(type) {
    case 'success':
      messageEl.style.cssText = successStyle;
      break;
    case 'error':
      messageEl.style.cssText = errorStyle;
      break;
    case 'warning':
      messageEl.style.cssText = warningStyle;
      break;
    case 'info':
      messageEl.style.cssText = infoStyle;
      break;
    default:
      messageEl.style.cssText = defaultStyle;
  }

  // 创建图标和内容
  const icon = createIcon(type);
  const contentEl = document.createElement('span');
  contentEl.textContent = content;

  // 组装消息元素
  messageEl.appendChild(icon);
  messageEl.appendChild(contentEl);
  container!.appendChild(messageEl);

  // 触发动画
  setTimeout(() => {
    messageEl.style.opacity = '1';
    messageEl.style.transform = 'translateX(0)';
  }, 10);

  // 自动关闭
  const timer = setTimeout(() => {
    closeMessage(messageId);
  }, duration);

  // 点击关闭
  messageEl.addEventListener('click', () => {
    clearTimeout(timer);
    closeMessage(messageId);
  });

  return {
    close: () => {
      clearTimeout(timer);
      closeMessage(messageId);
    }
  };
}

// 关闭消息
function closeMessage(id: string): void {
  const messageEl = document.getElementById(id);
  if (!messageEl) return;

  // 触发退出动画
  messageEl.style.opacity = '0';
  messageEl.style.transform = 'translateX(100%)';

  // 移除元素
  setTimeout(() => {
    if (container && messageEl.parentNode === container) {
      container.removeChild(messageEl);
    }
  }, 300);
}

// 导出公共方法
export const message = {
  /**
   * 显示成功消息
   * @param content 消息内容
   * @param duration 显示时长(毫秒)，默认3000
   * @returns 包含close方法的消息实例
   */
  success: (content: string, duration: number = 3000): MessageInstance => {
    return showMessage(content, 'success', duration);
  },

  /**
   * 显示错误消息
   * @param content 消息内容
   * @param duration 显示时长(毫秒)，默认3000
   * @returns 包含close方法的消息实例
   */
  error: (content: string, duration: number = 3000): MessageInstance => {
    return showMessage(content, 'error', duration);
  },

  /**
   * 显示警告消息
   * @param content 消息内容
   * @param duration 显示时长(毫秒)，默认3000
   * @returns 包含close方法的消息实例
   */
  warning: (content: string, duration: number = 3000): MessageInstance => {
    return showMessage(content, 'warning', duration);
  },

  /**
   * 显示信息消息
   * @param content 消息内容
   * @param duration 显示时长(毫秒)，默认3000
   * @returns 包含close方法的消息实例
   */
  info: (content: string, duration: number = 3000): MessageInstance => {
    return showMessage(content, 'info', duration);
  },

  /**
   * 显示自定义消息
   * @param config 消息配置
   * @returns 包含close方法的消息实例
   */
  open: (config: MessageConfig): MessageInstance => {
    const { content, type = 'default', duration = 3000 } = config;
    return showMessage(content, type, duration);
  },

  /**
   * 关闭所有消息
   */
  destroy: (): void => {
    if (container) {
      container.innerHTML = '';
    }
  }
};

export default message;
