<template>
  <CustomNav title="血压" leftType="back" />
  <view class="page">

    <view class="header">
      <view class="month-selector">
        <button class="btn" @click="prevPeriod">‹</button>
        <view class="period-controls">
          <picker mode="multiSelector" :value="pickerValue" :range="pickerRange" @change="onPickerChange">
            <view class="month-label">{{ displayPeriod }}</view>
          </picker>
          <view class="view-toggle">
            <button :class="['toggle-btn', { active: viewMode === 'month' }]" @click="setViewMode('month')">月</button>
            <button :class="['toggle-btn', { active: viewMode === 'week' }]" @click="setViewMode('week')">周</button>
          </view>
        </view>
        <button class="btn" @click="nextPeriod">›</button>
      </view>
    </view>

    <!-- 趋势图 - 简化canvas设置 -->
    <view class="chart-wrap">
      <view class="chart-header">本月趋势</view>
      <canvas 
        canvas-id="bpChart" 
        id="bpChart" 
        class="chart-canvas"
        :style="{ width: canvasWidth + 'px', height: canvasHeight + 'px' }"
      ></canvas>
    </view>

    <view class="content">
      <view class="summary">共 {{ records.length }} 条记录，本月平均：{{ averageSystolic }}/{{ averageDiastolic }} mmHg</view>

      <view class="list">
        <view v-if="records.length === 0" class="empty">暂无记录，点击右下角 + 添加</view>
        <view v-for="item in records" :key="item.id" class="list-item">
          <view class="date">{{ item.date }}</view>
          <view class="value">{{ item.s }}/{{ item.d }} mmHg</view>
          <button class="btn-delete" @click="confirmDeleteRecord(item.id)">✕</button>
        </view>
      </view>
    </view>

    <view class="fab" @click="openAdd">
      <view class="fab-inner">+</view>
    </view>

    <view class="modal" v-if="showAdd">
      <view class="modal-backdrop" @click="closeAdd"></view>
      <view class="modal-panel">
        <view class="drag-handle"></view>
        <view class="modal-header"><text class="modal-title">添加血压</text></view>

        <view class="modal-inner">
          <view class="form-row">
            <text class="label">日期</text>
            <picker mode="date" :value="addDate" @change="onAddDateChange">
              <view class="picker-display">{{ addDateLabel }}</view>
            </picker>
          </view>

          <view class="form-row">
            <text class="label">收缩压 (S)</text>
            <input type="number" v-model.number="addSystolic" class="input" placeholder="收缩压" />
          </view>
          <view class="form-row">
            <text class="label">舒张压 (D)</text>
            <input type="number" v-model.number="addDiastolic" class="input" placeholder="舒张压" />
          </view>
        </view>

        <view class="ruler-wrap">
          <view class="ruler-row">
            <ScaleRuler v-if="showAdd" :min="80" :max="220" :step="1" :gutter="16" :initialValue="addSystolic ?? 120" @update="onSUpdate" @change="onSChange" />
          </view>
          <view class="ruler-row">
            <ScaleRuler v-if="showAdd" :min="40" :max="140" :step="1" :gutter="16" :initialValue="addDiastolic ?? 80" @update="onDUpdate" @change="onDChange" />
          </view>
        </view>

        <view class="fixed-footer">
          <button class="btn-primary btn-full" @click="confirmAdd">保存</button>
        </view>
      </view>
    </view>

  </view>
  <TabBar />
</template>

<script setup lang="ts">
import { ref, computed, onMounted, watch, nextTick, onBeforeUnmount, getCurrentInstance } from 'vue'
import uCharts from '@qiun/ucharts'
import CustomNav from '@/components/custom-nav.vue'
import TabBar from '@/components/tab-bar.vue'
import ScaleRuler from '@/components/scale-ruler.vue'
import { getWeekStart, getWeekEnd, getWeekNumber, formatDisplayDate, formatPickerDate, daysInMonth, weekDayIndex } from '@/utils/date'

type RecordItem = { id: string; date: string; s: number; d: number }

// 当前展示年月
const current = ref(new Date())
// 使用 multiSelector 的索引形式： [yearOffset从2000起, month(0-11)]
const pickerValue = ref([current.value.getFullYear() - 2000, current.value.getMonth()])

// 视图模式：'month' 或 'week'
const viewMode = ref<'month' | 'week'>('month')

// 年月选择器的选项范围（与 height/weight 保持一致）
const pickerRange = ref([
  Array.from({ length: 50 }, (_, i) => `${2000 + i}年`),
  Array.from({ length: 12 }, (_, i) => `${i + 1}月`)
])

// 明确的canvas尺寸（将由 getCanvasSize 初始化以匹配设备宽度）
const canvasWidth = ref(700) // 初始值，会在 mounted 时覆盖
const canvasHeight = ref(320)

// 获取Canvas实际尺寸的函数 - 参考微信小程序示例使用固定尺寸
function getCanvasSize(): Promise<{ width: number; height: number }> {
  return new Promise((resolve) => {
    // 使用固定尺寸，参考微信小程序示例
    const windowWidth = uni.getSystemInfoSync().windowWidth;
    const width = windowWidth; // 占满屏幕宽度
    const height = 320 / 750 * windowWidth; // 320rpx转换为px，与CSS高度匹配
    resolve({ width, height });
  });
}

// 使用 formatPickerDate 从 src/utils/date.ts

const displayYear = computed(() => current.value.getFullYear())
const displayMonth = computed(() => current.value.getMonth() + 1)

// 显示周期（支持月/周）
const displayPeriod = computed(() => {
  if (viewMode.value === 'month') {
    return `${displayYear.value}年 ${displayMonth.value}月`
  } else {
    const weekStart = getWeekStart(current.value)
    const weekEnd = getWeekEnd(current.value)
    return `${formatDisplayDate(weekStart)} - ${formatDisplayDate(weekEnd)}`
  }
})

const records = ref<RecordItem[]>(generateMockRecords(current.value))

function generateMockRecords(d: Date): RecordItem[] {
  const arr: RecordItem[] = []
  if (viewMode.value === 'month') {
    const y = d.getFullYear()
    const m = d.getMonth()
    const n = Math.floor(Math.random() * Math.min(daysInMonth(y, m), 7))
    for (let i = 0; i < n; i++) {
      const day = Math.max(1, Math.floor(Math.random() * daysInMonth(y, m)) + 1)
      const date = new Date(y, m, day)
      const s = 100 + Math.floor(Math.random() * 40)
      const dval = 60 + Math.floor(Math.random() * 30)
      arr.push({ id: `${date.getTime()}-${i}`, date: formatDisplayDate(date), s, d: dval })
    }
  } else {
    const weekStart = getWeekStart(d)
    const n = Math.floor(Math.random() * 7)
    for (let i = 0; i < n; i++) {
      const dayOffset = Math.floor(Math.random() * 7)
      const date = new Date(weekStart)
      date.setDate(weekStart.getDate() + dayOffset)
      const s = 100 + Math.floor(Math.random() * 40)
      const dval = 60 + Math.floor(Math.random() * 30)
      arr.push({ id: `${date.getTime()}-${i}`, date: formatDisplayDate(date), s, d: dval })
    }
  }
  return arr.sort((a, b) => (a.date < b.date ? 1 : -1))
}

// 将 records 聚合为每天一个点（取最新记录）
function aggregateDaily(recordsArr: RecordItem[], year: number, month: number) {
  const map = new Map<number, RecordItem>()
  for (const r of recordsArr) {
    const parts = r.date.split('-')
    if (parts.length >= 3) {
      const y = parseInt(parts[0], 10)
      const m = parseInt(parts[1], 10) - 1
      const d = parseInt(parts[2], 10)
      if (y === year && m === month) {
        // 覆盖同一天，保留最新的（数组头部为最新）
        map.set(d, r)
      }
    }
  }
  // 返回按日索引的数组
  return map
}

const averageSystolic = computed(() => {
  if (records.value.length === 0) return '--'
  const sum = records.value.reduce((s, r) => s + r.s, 0)
  return Math.round(sum / records.value.length)
})
const averageDiastolic = computed(() => {
  if (records.value.length === 0) return '--'
  const sum = records.value.reduce((s, r) => s + r.d, 0)
  return Math.round(sum / records.value.length)
})

// 使用共享日期工具 (src/utils/date.ts)

// Canvas / uCharts 绘图 - 修复版本
const chartInstance = ref<any>(null)
const vm = getCurrentInstance()
let chartInitialized = false
let chartBusy = false // 绘图锁，防止并发初始化/更新

// 简化的图表绘制函数（支持月/周视图）
async function drawChart() {
  if (chartBusy) return
  chartBusy = true

  if (chartInitialized && chartInstance.value) {
    try { await updateChartData() } finally { chartBusy = false }
    return
  }

  if (chartInstance.value) {
    try { if (chartInstance.value.destroy) chartInstance.value.destroy() } catch (e) { console.warn('Destroy chart error:', e) }
    chartInstance.value = null
  }

  if (typeof uCharts === 'undefined') { console.warn('uCharts not available'); return }

  const size = await getCanvasSize()
  const cssWidth = size.width
  const cssHeight = size.height
  const pixelRatio = 1
  const rightGap = Math.max(24, Math.round(cssWidth * 0.04))
  const chartWidth = Math.max(cssWidth - rightGap, Math.round(cssWidth * 0.85))

  const year = current.value.getFullYear()
  const month = current.value.getMonth()

  const categories: string[] = []
  if (viewMode.value === 'month') {
    const days = daysInMonth(year, month)
    const showLabelDays: number[] = []
    if (days > 0) {
      showLabelDays.push(1)
      if (days > 1) showLabelDays.push(days)
      if (days > 7) showLabelDays.push(Math.ceil(days / 3))
      if (days > 14) showLabelDays.push(Math.ceil(days * 2 / 3))
    }
    for (let d = 1; d <= days; d++) categories.push(showLabelDays.includes(d) ? `${d}日` : '')
  } else {
    const weekStart = getWeekStart(current.value)
    const weekDays = ['一','二','三','四','五','六','日']
    for (let i = 0; i < 7; i++) {
      const date = new Date(weekStart)
      date.setDate(weekStart.getDate() + i)
      categories.push(`${date.getDate()}日(${weekDays[i]})`)
    }
  }

  const sData: number[] = []
  const dData: number[] = []
  const filteredCategories: string[] = []
  const dayMap = new Map<number, RecordItem>()

  if (viewMode.value === 'month') {
    for (const r of records.value) {
      const parts = r.date.split('-')
      if (parts.length >= 3) {
        const y = parseInt(parts[0], 10)
        const m = parseInt(parts[1], 10) - 1
        const d = parseInt(parts[2], 10)
        if (y === year && m === month) dayMap.set(d, r)
      }
    }
    const sortedDays = Array.from(dayMap.keys()).sort((a, b) => a - b)
    for (const day of sortedDays) { const rec = dayMap.get(day)!; filteredCategories.push(`${day}日`); sData.push(rec.s); dData.push(rec.d) }
  } else {
    const weekStart = getWeekStart(current.value)
    for (const r of records.value) {
      const parts = r.date.split('-')
      if (parts.length >= 3) {
        const recordDate = new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10))
        const weekStartDate = getWeekStart(recordDate)
        if (weekStartDate.getTime() === weekStart.getTime()) {
          const dayOfWeek = recordDate.getDay() || 7
          dayMap.set(dayOfWeek, r)
        }
      }
    }
    const weekDays = ['一','二','三','四','五','六','日']
    for (let i = 1; i <= 7; i++) {
      const rec = dayMap.get(i)
      if (rec) { const date = new Date(rec.date); filteredCategories.push(`${date.getDate()}日(${weekDays[i-1]})`); sData.push(rec.s); dData.push(rec.d) }
    }
  }

  const categoriesToUse = filteredCategories.length ? filteredCategories : categories

  const allData = [...sData, ...dData]
  const validData = allData.filter(v => v > 0)
  const minVal = validData.length ? Math.floor(Math.min(...validData)) - 5 : 60
  const maxVal = validData.length ? Math.ceil(Math.max(...validData)) + 5 : 180

  const series = [ { name: '收缩压', data: sData, color: '#ff6a00' }, { name: '舒张压', data: dData, color: '#007aff' } ]

  let ctx: any = null
  try {
    if (typeof uni !== 'undefined' && typeof uni.createCanvasContext === 'function') {
      try { ctx = vm?.proxy ? uni.createCanvasContext('bpChart', vm.proxy) : uni.createCanvasContext('bpChart') } catch (e) { try { ctx = uni.createCanvasContext('bpChart') } catch (err) { ctx = null } }
    }
  } catch (e) { ctx = null }

  if (!ctx && typeof document !== 'undefined') {
    try {
      let el: HTMLCanvasElement | null = null
      for (let attempt = 0; attempt < 3; attempt++) {
        el = document.getElementById('bpChart') as HTMLCanvasElement | null
        if (el) break
        await new Promise(r => setTimeout(r, 50))
      }
      if (el && el.getContext) {
        try { const physicalW = Math.floor(cssWidth * pixelRatio); const physicalH = Math.floor(cssHeight * pixelRatio); if (el.width !== physicalW || el.height !== physicalH) { el.width = physicalW; el.height = physicalH; el.style.width = cssWidth + 'px'; el.style.height = cssHeight + 'px' } } catch (e) { console.warn('Set canvas physical size failed', e) }
        ctx = el.getContext('2d')
      }
    } catch (e) { ctx = null }
  }

  if (!ctx) { console.warn('Unable to obtain canvas context for uCharts.'); return }

  const config = {
    $this: vm?.proxy,
    canvasId: 'bpChart',
    context: ctx,
    type: 'line',
    fontSize: 10,
    categories: categoriesToUse,
    series: series,
    width: chartWidth,
    padding: [10, rightGap + 8, 18, 10],
    height: cssHeight,
    pixelRatio,
    background: 'transparent',
    animation: false,
    enableScroll: false,
    dataLabel: false,
    legend: { show: true, position: 'top', float: 'right', fontSize: 10, spacing: 0 },
    xAxis: { disableGrid: true, axisLine: true, axisLineColor: '#e0e0e0', fontColor: '#666666', fontSize: 10, boundaryGap: 'justify' },
    yAxis: { disableGrid: false, gridColor: '#f5f5f5', splitNumber: 4, min: minVal, max: maxVal, axisLine: true, axisLineColor: '#e0e0e0', fontColor: '#666666', fontSize: 10, format: (val: number) => val % 1 === 0 ? `${val}mmHg` : '' },
    extra: { line: { type: 'curve', width: 1, activeType: 'point', point: { radius: 0.5, strokeWidth: 0.5 } }, tooltip: { showBox: false, showCategory: false } }
  }

  try {
    if (chartInstance.value && chartInstance.value.destroy) { try { chartInstance.value.destroy() } catch (e) { console.warn('destroy before init failed', e) } chartInstance.value = null; chartInitialized = false }
    chartInstance.value = new uCharts(config)
    chartInitialized = true
  } catch (error) { console.error('uCharts init error:', error); chartInitialized = false }
  chartBusy = false
}

// 更新数据而不重新初始化
async function updateChartData() {
  if (chartBusy) return
  chartBusy = true

  if (!chartInstance.value || !chartInitialized) {
    try {
      await drawChart()
    } finally {
      chartBusy = false
    }
    return
  }
  const year = current.value.getFullYear()
  const month = current.value.getMonth()

  const categories: string[] = []
  const dataS: number[] = []
  const dataD: number[] = []
  const filteredCategories: string[] = []
  const dayMap = new Map<number, RecordItem>()

  if (viewMode.value === 'month') {
    const days = daysInMonth(year, month)
    const showLabelDays: number[] = []
    if (days > 0) {
      showLabelDays.push(1)
      if (days > 1) showLabelDays.push(days)
      if (days > 7) showLabelDays.push(Math.ceil(days / 3))
      if (days > 14) showLabelDays.push(Math.ceil(days * 2 / 3))
    }
    for (let d = 1; d <= days; d++) categories.push(showLabelDays.includes(d) ? `${d}日` : '')

    for (const r of records.value) {
      const parts = r.date.split('-')
      if (parts.length >= 3) {
        const y = parseInt(parts[0], 10)
        const m = parseInt(parts[1], 10) - 1
        const d = parseInt(parts[2], 10)
        if (y === year && m === month) dayMap.set(d, r)
      }
    }
    const sortedDays = Array.from(dayMap.keys()).sort((a, b) => a - b)
    for (const d of sortedDays) { const rec = dayMap.get(d)!; filteredCategories.push(`${d}日`); dataS.push(rec.s); dataD.push(rec.d) }
  } else {
    const weekStart = getWeekStart(current.value)
    const weekDays = ['一','二','三','四','五','六','日']
    for (let i = 0; i < 7; i++) {
      const date = new Date(weekStart)
      date.setDate(weekStart.getDate() + i)
      categories.push(`${date.getDate()}日(${weekDays[i]})`)
    }

    for (const r of records.value) {
      const parts = r.date.split('-')
      if (parts.length >= 3) {
        const recordDate = new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10))
        const weekStartDate = getWeekStart(recordDate)
        if (weekStartDate.getTime() === weekStart.getTime()) {
          const dayOfWeek = recordDate.getDay() || 7
          dayMap.set(dayOfWeek, r)
        }
      }
    }
    for (let i = 1; i <= 7; i++) {
      const rec = dayMap.get(i)
      if (rec) { const date = new Date(rec.date); filteredCategories.push(`${date.getDate()}日(${weekDays[i-1]})`); dataS.push(rec.s); dataD.push(rec.d) }
    }
  }

  const categoriesToUse = filteredCategories.length ? filteredCategories : categories
  const allData = [...dataS, ...dataD]
  const validData = allData.filter(v => v > 0)
  const minVal = validData.length ? Math.floor(Math.min(...validData)) - 5 : 60
  const maxVal = validData.length ? Math.ceil(Math.max(...validData)) + 5 : 180

  try {
    try {
      const size = await getCanvasSize()
      const cssWidth = size.width
      const rightGap = Math.max(24, Math.round(cssWidth * 0.04))
      const chartWidth = Math.max(cssWidth - rightGap, Math.round(cssWidth * 0.85))
      if (chartInstance.value.opts) {
        chartInstance.value.opts.width = chartWidth
        chartInstance.value.opts.padding = [10, rightGap + 8, 18, 10]
      }
    } catch (e) {}

    chartInstance.value.updateData({ categories: categoriesToUse, series: [{ name: '收缩压', data: dataS, color: '#ff6a00' }, { name: '舒张压', data: dataD, color: '#007aff' }] })
    chartInstance.value.opts.yAxis.min = minVal
    chartInstance.value.opts.yAxis.max = maxVal
  } catch (error) {
    console.error('Update chart error:', error)
    try { if (chartInstance.value && chartInstance.value.destroy) chartInstance.value.destroy() } catch (e) { console.warn('destroy on update failure failed', e) }
    chartInstance.value = null
    chartInitialized = false
    try { await drawChart() } catch (e) { console.error('re-init after update failure also failed', e) }
  }
  chartBusy = false
}

onMounted(() => {
  // 延迟确保DOM渲染完成
  setTimeout(async () => {
    await nextTick()
    // 由 getCanvasSize 计算并覆盖 canvasWidth/canvasHeight（确保模板样式和绘图一致）
    try {
      const size = await getCanvasSize()
      canvasWidth.value = size.width
      canvasHeight.value = size.height
    } catch (e) {
      console.warn('getCanvasSize failed on mounted', e)
    }
    await drawChart()
  }, 500)
})

// 简化监听，避免频繁重绘
watch([() => current.value], async () => {
  setTimeout(async () => {
    await updateChartData()
  }, 100)
})

watch([() => records.value], async () => {
  setTimeout(async () => {
    await updateChartData()
  }, 100)
}, { deep: true })

onBeforeUnmount(() => {
  if (chartInstance.value && chartInstance.value.destroy) {
    try {
      chartInstance.value.destroy()
    } catch (e) {
      console.warn('uCharts destroy error:', e)
    }
  }
  chartInstance.value = null
  chartInitialized = false
})

// 强制重建图表（用于切换月份时彻底刷新，如同退出页面再进入）
async function rebuildChart() {
  // 如果正在绘制，等一小会儿再销毁
  if (chartBusy) {
    // 等待最大 300ms，避免长时间阻塞
    await new Promise(r => setTimeout(r, 50))
  }
  try {
    if (chartInstance.value && chartInstance.value.destroy) {
      try { chartInstance.value.destroy() } catch (e) { console.warn('destroy in rebuildChart failed', e) }
    }
  } catch (e) {
    console.warn('rebuildChart destroy error', e)
  }
  chartInstance.value = null
  chartInitialized = false
  // 等待 DOM/Tick 稳定
  await nextTick()
  // 重新初始化
  try {
    await drawChart()
  } catch (e) {
    console.error('rebuildChart drawChart failed', e)
  }
}

// 周/月周期导航与 Picker 处理
async function prevPeriod() {
  const d = new Date(current.value)
  if (viewMode.value === 'month') {
    d.setMonth(d.getMonth() - 1)
  } else {
    d.setDate(d.getDate() - 7)
  }
  current.value = d
  pickerValue.value = [d.getFullYear() - 2000, d.getMonth()]
  records.value = generateMockRecords(d)
  await rebuildChart()
}

async function nextPeriod() {
  const d = new Date(current.value)
  if (viewMode.value === 'month') {
    d.setMonth(d.getMonth() + 1)
  } else {
    d.setDate(d.getDate() + 7)
  }
  current.value = d
  pickerValue.value = [d.getFullYear() - 2000, d.getMonth()]
  records.value = generateMockRecords(d)
  await rebuildChart()
}

async function setViewMode(mode: 'month' | 'week') {
  if (viewMode.value !== mode) {
    viewMode.value = mode
    records.value = generateMockRecords(current.value)
    await rebuildChart()
  }
}

async function onPickerChange(e: any) {
  const val = e?.detail?.value || e
  if (Array.isArray(val) && val.length >= 2) {
    const y = 2000 + val[0]
    const m = val[1]
    const d = new Date(y, m, 1)
    current.value = d
    pickerValue.value = [val[0], val[1]]
    records.value = generateMockRecords(d)
    await rebuildChart()
  }
}

// 添加逻辑保持不变
const showAdd = ref(false)
const addDate = ref(formatPickerDate(new Date()))
const addDateLabel = ref(formatDisplayDate(new Date()))
const addSystolic = ref<number | null>(null)
const addDiastolic = ref<number | null>(null)

function onSUpdate(v: number) { addSystolic.value = Math.round(v) }
function onSChange(v: number) { addSystolic.value = Math.round(v) }
function onDUpdate(v: number) { addDiastolic.value = Math.round(v) }
function onDChange(v: number) { addDiastolic.value = Math.round(v) }

function openAdd() { 
  showAdd.value = true; 
  if (!addSystolic.value) addSystolic.value = 120; 
  if (!addDiastolic.value) addDiastolic.value = 80 
}
function closeAdd() { 
  showAdd.value = false; 
  addSystolic.value = null; 
  addDiastolic.value = null 
}

function onAddDateChange(e: any) { 
  const val = e?.detail?.value || e; 
  addDate.value = val; 
  addDateLabel.value = val.replace(/^(.{10}).*$/, '$1') 
}

async function confirmAdd() {
  if (!addSystolic.value || !addDiastolic.value) { 
    uni.showToast && uni.showToast({ title: '请输入血压值', icon: 'none' }); 
    return 
  }
  const id = `user-${Date.now()}`
  const item: RecordItem = { 
    id, 
    date: addDateLabel.value, 
    s: Math.round(addSystolic.value), 
    d: Math.round(addDiastolic.value) 
  }
  const parts = addDate.value.split('-')
  const addY = parseInt(parts[0], 10)
  const addM = parseInt(parts[1], 10) - 1
  if (viewMode.value === 'month') {
    if (addY === current.value.getFullYear() && addM === current.value.getMonth()) {
      records.value = [item, ...records.value]
    }
  } else {
    const addDateObj = new Date(addY, addM, parseInt(parts[2] || '1', 10))
    const addWeekStart = getWeekStart(addDateObj)
    const curWeekStart = getWeekStart(current.value)
    if (addWeekStart.getTime() === curWeekStart.getTime()) {
      records.value = [item, ...records.value]
    }
  }
  uni.showToast && uni.showToast({ title: '已添加', icon: 'success' })
  closeAdd()
  // 新增记录后彻底重建图表，确保像退出再进入一样刷新
  try {
    await rebuildChart()
  } catch (e) {
    console.warn('rebuildChart after add failed', e)
  }
}

async function confirmDeleteRecord(id: string) { 
  if (typeof uni !== 'undefined' && uni.showModal) { 
    uni.showModal({ 
      title: '删除', 
      content: '确认删除该条记录吗？', 
      success: async (res: any) => { 
        if (res.confirm) {
          records.value = records.value.filter(r => r.id !== id)
          try { await rebuildChart() } catch (e) { console.warn('rebuildChart after delete failed', e) }
        }
      } 
    }) 
  } else { 
    records.value = records.value.filter(r => r.id !== id)
    try { await rebuildChart() } catch (e) { console.warn('rebuildChart after delete failed', e) }
  } 
}
</script>

<style scoped>
.page { 
  min-height: calc(100vh); 
  padding-top: calc(var(--status-bar-height) + 44px); 
  background: #f5f6f8; 
  box-sizing: border-box 
}

.header { 
  padding: 20rpx 40rpx 
}

.month-selector { 
  display: flex; 
  align-items: center; 
  justify-content: center; 
  gap: 12rpx 
}

.period-controls {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8rpx;
}

.view-toggle {
  display: flex;
  gap: 4rpx;
}

.toggle-btn {
  padding: 4rpx 12rpx;
  border: 1rpx solid #ddd;
  background: #f5f5f5;
  color: #666;
  border-radius: 6rpx;
  font-size: 24rpx;
  min-width: 60rpx;
  text-align: center;
}

.toggle-btn.active {
  background: #ff6a00;
  color: #fff;
  border-color: #ff6a00;
}

.month-label { 
  font-size: 34rpx; 
  color: #333 
}

.btn { 
  background: transparent; 
  border: none; 
  font-size: 36rpx; 
  color: #666 
}

.content { 
  padding: 20rpx 24rpx 100rpx 24rpx 
}

.chart-wrap { 
  background: #fff; 
  border-radius: 12rpx; 
  padding: 24rpx; 
  margin: 0 24rpx 20rpx 24rpx; 
  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.03) 
}

.chart-header { 
  font-size: 32rpx; 
  color: #333; 
  margin-bottom: 20rpx; 
  font-weight: 600 
}

/* 关键修复：确保canvas样式正确，参考微信小程序示例 */
.chart-canvas {
  width: 750rpx;
  height: 320rpx;
  background-color: #FFFFFF;
  display: block;
}

.summary { 
  padding: 20rpx; 
  color: #666; 
  font-size: 28rpx 
}

.list { 
  background: #fff; 
  border-radius: 12rpx; 
  padding: 10rpx; 
  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.03) 
}

.empty { 
  padding: 40rpx; 
  text-align: center; 
  color: #999 
}

.list-item { 
  display: flex; 
  align-items: center; 
  padding: 20rpx; 
  border-bottom: 1rpx solid #f0f0f0 
}

.list-item .date { 
  color: #666 
}

.list-item .value { 
  color: #333; 
  font-weight: 600; 
  flex: 1; 
  text-align: right 
}

.btn-delete { 
  width: 80rpx; 
  height: 60rpx; 
  min-width: 60rpx; 
  min-height: 60rpx; 
  display: inline-flex; 
  align-items: center; 
  justify-content: center; 
  background: #fff0f0; 
  color: #d9534f; 
  border: 1rpx solid rgba(217,83,79,0.15); 
  border-radius: 8rpx; 
  margin-left: 30rpx 
}

.fab { 
  position: fixed; 
  right: 28rpx; 
  bottom: 160rpx; 
  width: 110rpx; 
  height: 110rpx; 
  border-radius: 999px; 
  background: linear-gradient(180deg, #ff7a00, #ff4a00); 
  display: flex; 
  align-items: center; 
  justify-content: center; 
  box-shadow: 0 6rpx 18rpx rgba(0, 0, 0, 0.2); 
  z-index: 1200 
}

.fab-inner { 
  color: #fff; 
  font-size: 56rpx; 
  line-height: 56rpx 
}

.modal { 
  position: fixed; 
  left: 0; 
  right: 0; 
  top: 0; 
  bottom: 0; 
  display: flex; 
  align-items: flex-end; 
  justify-content: center; 
  z-index: 1300 
}

.modal-backdrop { 
  position: absolute; 
  left: 0; 
  right: 0; 
  top: 0; 
  bottom: 0; 
  background: rgba(0, 0, 0, 0.4) 
}

.modal-panel { 
  position: relative; 
  width: 100%; 
  background: #fff; 
  border-top-left-radius: 18rpx; 
  border-top-right-radius: 18rpx; 
  padding: 28rpx 24rpx 140rpx 24rpx; 
  box-shadow: 0 -8rpx 30rpx rgba(0,0,0,0.12) 
}

.modal-title { 
  font-size: 56rpx; 
  margin-block: 60rpx; 
  color: #222; 
  font-weight: 700; 
  letter-spacing: 1rpx 
}

.modal-inner { 
  max-width: 70%; 
  margin: 0 auto 
}

.form-row { 
  display: flex; 
  align-items: center; 
  justify-content: space-between; 
  margin-bottom: 34rpx; 
  padding: 14rpx 0; 
  font-size: 32rpx 
}

.input { 
  width: 150rpx; 
  text-align: right; 
  padding: 16rpx; 
  border-radius: 14rpx; 
  border: 1rpx solid #eee; 
  background: #fff7f0 
}

.picker-display { 
  color: #333 
}

.btn-primary { 
  background: #ff6a00; 
  color: #fff; 
  padding: 18rpx 22rpx; 
  border-radius: 16rpx; 
  text-align: center; 
  width: 50%; 
  box-shadow: 0 10rpx 28rpx rgba(255,106,0,0.18) 
}

.drag-handle { 
  width: 64rpx; 
  height: 6rpx; 
  background: rgba(0,0,0,0.08); 
  border-radius: 999px; 
  margin: 10rpx auto 14rpx auto 
}

.modal-header { 
  display: flex; 
  align-items: center; 
  justify-content: center; 
  gap: 12rpx; 
  margin-bottom: 6rpx 
}

.label { 
  color: #666 
}

.ruler-wrap { 
  margin: 12rpx 0 
}

.ruler-row { 
  margin-bottom: 8rpx 
}

.fixed-footer { 
  position: absolute; 
  left: 0; 
  right: 0; 
  bottom: 40rpx; 
  padding: 0 24rpx 
}

.btn-full { 
  width: 100%; 
  padding: 18rpx; 
  border-radius: 12rpx; 
}
</style>