import {
  APPLICATION_WELCOME_QUICK_ACTIONS,
  APPROVAL_WELCOME_QUICK_ACTIONS,
  ASSISTANT_DISPLAY_NAME,
  BUDGET_WELCOME_QUICK_ACTIONS,
  EXPENSE_WELCOME_QUICK_ACTIONS,
  HOT_KNOWLEDGE_QUESTIONS,
  SESSION_TYPE_APPLICATION,
  SESSION_TYPE_APPROVAL,
  SESSION_TYPE_BUDGET,
  SESSION_TYPE_EXPENSE,
  SESSION_TYPE_KNOWLEDGE,
  SESSION_TYPE_STEWARD,
  normalizeAssistantSessionType
} from './travelReimbursementConversationSessionModel.js'
import { createMessage } from './travelReimbursementConversationMessageModel.js'

export function buildWelcomeUserContext(user = {}) {
  const username = String(user.username || '').trim()
  const name = String(user.name || username || '同事').trim()
  const grade = String(user.grade || '').trim()
  const position = String(user.position || '').trim()
  const role = String(user.role || '').trim()
  const roleCodes = Array.isArray(user.roleCodes) ? user.roleCodes : []
  const isAdmin =
    Boolean(user.isAdmin)
    || username.toLowerCase() === 'admin'
    || roleCodes.some((item) => /admin|manager/i.test(String(item || '')))
    || /管理员|系统管理/.test(position)
    || /管理员|系统管理/.test(role)

  const now = new Date()
  const dateLine = now.toLocaleDateString('zh-CN', {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long'
  })

  let honorific = name
  if (isAdmin) {
    honorific = name && !/^admin$/i.test(name) ? `${name} 管理员` : '管理员'
  } else {
    const prefix = [grade, position].filter(Boolean).join(' ')
    honorific = prefix ? `${prefix} ${name}`.trim() : name
  }

  return {
    name,
    username,
    grade,
    position,
    role,
    isAdmin,
    honorific,
    dateLine
  }
}

export function buildWelcomeQuickActions(sessionType, user, entrySource, linkedRequest) {
  const normalizedSessionType = normalizeAssistantSessionType(sessionType)
  if (normalizedSessionType === SESSION_TYPE_KNOWLEDGE) {
    return HOT_KNOWLEDGE_QUESTIONS.slice(0, 6).map((question) => ({
      label: question.length > 20 ? `${question.slice(0, 20)}…` : question,
      prompt: question,
      icon: 'mdi mdi-comment-question-outline'
    }))
  }

  if (normalizedSessionType === SESSION_TYPE_STEWARD) {
    return [
      {
        label: '申请出差并报销票据',
        prompt: '我想申请下周去北京出差，并报销昨天的交通费。',
        icon: 'mdi mdi-account-tie-outline'
      },
      {
        label: '归集多张附件',
        prompt: '我上传了多张票据，请先帮我判断哪些属于差旅报销。',
        icon: 'mdi mdi-folder-multiple-outline'
      }
    ]
  }

  if (normalizedSessionType === SESSION_TYPE_APPLICATION) {
    return APPLICATION_WELCOME_QUICK_ACTIONS
  }

  if (normalizedSessionType === SESSION_TYPE_APPROVAL) {
    return APPROVAL_WELCOME_QUICK_ACTIONS
  }

  if (normalizedSessionType === SESSION_TYPE_BUDGET) {
    return BUDGET_WELCOME_QUICK_ACTIONS
  }

  return EXPENSE_WELCOME_QUICK_ACTIONS
}

export function buildWelcomeMessage(entrySource, linkedRequest, sessionType = SESSION_TYPE_EXPENSE, user = null) {
  const normalizedSessionType = normalizeAssistantSessionType(sessionType)
  const ctx = buildWelcomeUserContext(user || {})
  const greeting = ctx.isAdmin ? `${ctx.honorific}，您好` : `您好，${ctx.honorific}`

  if (normalizedSessionType === SESSION_TYPE_KNOWLEDGE) {
    return [
      `${greeting}！今日是 **${ctx.dateLine}**。`,
      '',
      '**欢迎来到个人财务中心 · 财务知识助手。** 我可以帮您查制度、报销标准、票据要求和常见财务问题，并保持知识问答对话独立记录。',
      '',
      '业务范围：财务制度、标准规则、票据要求和政策口径解释。发起申请、报销处理或审核动作请切换到对应助手。',
      '',
      '您可以直接输入问题，或点击下方「猜你想问」快速开始。'
    ].join('\n')
  }

  if (normalizedSessionType === SESSION_TYPE_STEWARD) {
    return [
      `${greeting}！今日是 **${ctx.dateLine}**。`,
      '',
      '**欢迎来到个人财务中心 · 小财管家。** 我会先拆解您的一句话多任务，归集附件，再把确认后的任务分派给申请助手或报销助手。',
      '',
      '业务范围：多任务识别、附件归集、确认点管理、申请助手和报销助手调度。创建单据、绑定附件和提交审批都会先让您确认。',
      '',
      '您可以一次性描述多个申请或报销事项，也可以先上传附件让我归集。'
    ].join('\n')
  }

  if (normalizedSessionType === SESSION_TYPE_APPLICATION) {
    return [
      `${greeting}！今日是 **${ctx.dateLine}**。`,
      '',
      '**欢迎来到个人财务中心 · 申请助手。** 我会先判断您要处理的是费用申请、报销申请还是其他财务事项，再按对应流程引导补充信息。',
      '',
      '业务范围：费用申请、事前审批、申请材料清单和申请单状态。报销票据、审核处理和制度问答请切换到对应助手。',
      '',
      '您可以直接描述申请事项，或点击下方快捷操作开始发起申请。'
    ].join('\n')
  }

  if (normalizedSessionType === SESSION_TYPE_APPROVAL) {
    return [
      `${greeting}！今日是 **${ctx.dateLine}**。`,
      '',
      '**欢迎来到个人财务中心 · 审核助手。** 我可以帮您查询待审单据、解释风险点、整理审核意见，并保持审核对话独立记录。',
      '',
      '业务范围：待审单据查询、审批动作、风险解释和审核意见草稿。申请、报销和制度问答请切换到对应助手。',
      '',
      '您可以直接输入要审核或查询的内容，或点击下方快捷操作快速开始。'
    ].join('\n')
  }

  if (normalizedSessionType === SESSION_TYPE_BUDGET) {
    return [
      `${greeting}！今日是 **${ctx.dateLine}**。`,
      '',
      '**欢迎来到个人财务中心 · 预算编制助手。** 我可以帮您查询预算编制情况、整理费用类型预算、检查提醒/告警/风险阈值，并保持预算对话独立记录。',
      '',
      '业务范围：预算编制查询、部门预算检查、费用类型额度梳理、预算占用说明和阈值风险分析。报销发起、审核动作和制度问答请切换到对应助手。',
      '',
      '您可以直接输入预算问题，或点击下方快捷操作快速开始。'
    ].join('\n')
  }

  if (entrySource === 'detail' && linkedRequest?.id) {
    return [
      `${greeting}！今日是 **${ctx.dateLine}**。`,
      '',
      `我已为您打开关联单据 **${linkedRequest.id}**。您可以继续补充票据、核对识别结果，或让我解释待补项与风险。`,
      '',
      '如需新建其他报销，也可以直接告诉我费用场景，或上传发票、行程单开始识别。'
    ].join('\n')
  }

  return [
    `${greeting}！今日是 **${ctx.dateLine}**。`,
    '',
    '**欢迎来到个人财务中心 · 报销助手。** 我可以陪您完成报销发起、票据识别、草稿归集、报销信息核对、待补项提醒和风险说明，并保持报销对话独立记录。',
    '',
    '业务范围：发起报销、票据识别、草稿归集、报销状态查询和报销信息核对。申请、审核和制度问答请切换到对应助手。',
    '',
    '您可以描述一笔费用、上传票据，或点击下方快捷操作直接开始。'
  ].join('\n')
}

export function buildWelcomeInsight(entrySource, linkedRequest, sessionType = SESSION_TYPE_EXPENSE, user = null) {
  const normalizedSessionType = normalizeAssistantSessionType(sessionType)
  const ctx = buildWelcomeUserContext(user || {})

  if (normalizedSessionType === SESSION_TYPE_KNOWLEDGE) {
    return {
      intent: 'welcome',
      metricLabel: '今日',
      metricValue: ctx.dateLine.split(' ')[0] || '—',
      title: '财务知识问答',
      summary: `${ctx.honorific}，右侧整理了热门制度问题，点选即可追问；左侧也可直接输入您关心的问题。`,
      agent: null
    }
  }

  if (normalizedSessionType === SESSION_TYPE_STEWARD) {
    return {
      intent: 'welcome',
      metricLabel: '当前入口',
      metricValue: '小财管家',
      title: '小财管家',
      summary: `${ctx.honorific}，这里会先拆解多任务和归集附件，再把确认后的事项交给申请助手或报销助手处理。`,
      agent: null
    }
  }

  if (normalizedSessionType === SESSION_TYPE_APPLICATION) {
    return {
      intent: 'welcome',
      metricLabel: '当前助手',
      metricValue: '申请助手',
      title: '申请助手',
      summary: `${ctx.honorific}，这里会单独保存费用申请相关对话，不会混入报销、审核或知识问答记录。`,
      agent: null
    }
  }

  if (normalizedSessionType === SESSION_TYPE_APPROVAL) {
    return {
      intent: 'welcome',
      metricLabel: '当前助手',
      metricValue: '审核助手',
      title: '审核助手',
      summary: `${ctx.honorific}，这里会单独保存审核相关对话，适合查询待审单据、风险点和审核意见。`,
      agent: null
    }
  }

  if (normalizedSessionType === SESSION_TYPE_BUDGET) {
    return {
      intent: 'welcome',
      metricLabel: '当前助手',
      metricValue: '预算编制助手',
      title: '预算编制助手',
      summary: `${ctx.honorific}，这里会单独保存预算相关对话，适合查询预算编制、预算占用和阈值风险。`,
      agent: null
    }
  }

  return {
    intent: 'welcome',
    metricLabel: '当前助手',
    metricValue: '报销助手',
    title:
      entrySource === 'detail' && linkedRequest?.id
        ? `已关联 ${linkedRequest.id}`
        : '报销助手',
    summary:
      entrySource === 'detail' && linkedRequest?.id
        ? `${ctx.honorific}，发送消息或上传附件后，我会结合当前单据继续识别并提示待补项。`
        : `${ctx.honorific}，描述费用场景或上传票据后，我会在右侧展示识别结果，并在对话中提示待补信息与风险。`,
    agent: null
  }
}

export function createWelcomeAssistantMessage(entrySource, linkedRequest, sessionType = SESSION_TYPE_EXPENSE, user = null) {
  return createMessage('assistant', buildWelcomeMessage(entrySource, linkedRequest, sessionType, user), [], {
    assistantName: ASSISTANT_DISPLAY_NAME,
    isWelcome: true,
    welcomeQuickActions: buildWelcomeQuickActions(sessionType, user, entrySource, linkedRequest)
  })
}
