<template>
  <XtfConfigProvider class="demo-theme-root" :theme="demoTheme" component-size="md" :safe-area="true">
    <scroll-view class="rate-demo-scroll xtf-page-scroll" direction="vertical">
      <view class="rate-demo-page xtf-page-scroll-content">
        <view class="rate-demo-header">
          <view class="rate-demo-header-copy">
            <text class="rate-demo-kicker">XTF LINKUI / COMPONENTS</text>
            <text class="rate-demo-title">Rate</text>
            <text class="rate-demo-intro">评分交互、状态控制与受控回显工作台</text>
          </view>
          <text class="rate-demo-header-state">{{ score.toString() }} / 5</text>
        </view>

        <view class="rate-demo-section">
          <view class="rate-demo-section-head"><text class="rate-demo-heading">基础评分</text><text class="rate-demo-index">01</text></view>
          <text class="rate-demo-copy">点击星级提交，实时事件会同步到下方状态。</text>
          <XtfRate id="rate-basic" v-model="score" show-value show-text :texts="scoreTexts" @changing="recordChanging" @change="recordChange" />
          <text id="rate-basic-result" class="rate-demo-value">{{ eventText }}</text>
        </view>

        <view class="rate-demo-section">
          <view class="rate-demo-section-head"><text class="rate-demo-heading">半星与滑动</text><text class="rate-demo-index">02</text></view>
          <text class="rate-demo-copy">点击图标两侧或按住横向拖动，允许 0.5 步进。</text>
          <XtfRate id="rate-half-slide" v-model="halfScore" allow-half allow-slide show-value show-text :texts="scoreTexts" @change="recordHalf" />
          <text id="rate-half-result" class="rate-demo-value">当前半星值: {{ halfScore.toString() }}</text>
        </view>

        <view class="rate-demo-section">
          <view class="rate-demo-section-head"><text class="rate-demo-heading">十分制与精度</text><text class="rate-demo-index">03</text></view>
          <text class="rate-demo-copy">10 颗小尺寸图标控制总分，precision 为 0.25。</text>
          <XtfRate id="rate-ten-point" v-model="tenScore" :count="10" :size="26" :precision="0.25" allow-slide show-value active-color="#0f766e" inactive-color="#cbd5e1" />
          <text id="rate-ten-result" class="rate-demo-value">十分制: {{ tenScore.toString() }} / 10 · 步进 0.25</text>
        </view>

        <view class="rate-demo-section">
          <view class="rate-demo-section-head"><text class="rate-demo-heading">形态与清空</text><text class="rate-demo-index">04</text></view>
          <XtfRate id="rate-heart-clear" v-model="heartScore" display-mode="heart" active-color="#ef4444" allow-half show-value clearable />
          <text class="rate-demo-copy">再次点击当前值会清零，适合可撤销的满意度输入。</text>
          <XtfRate id="rate-readonly-static" :model-value="4.5" allow-half readonly show-value show-text :texts="scoreTexts" />
          <XtfRate id="rate-disabled-static" :model-value="3" disabled show-value />
          <text class="rate-demo-value">只读结果跟随基础评分: {{ score.toString() }} / 5</text>
        </view>

        <view class="rate-demo-section">
          <view class="rate-demo-section-head"><text class="rate-demo-heading">真实状态开关</text><text class="rate-demo-index">05</text></view>
          <text class="rate-demo-copy">开关直接作用于同一个评分实例，便于核对交互边界。</text>
          <view class="rate-demo-settings">
            <view class="rate-demo-setting"><text class="rate-demo-setting-label">只读</text><switch id="rate-readonly-switch" :checked="readonlyEnabled" @change="setReadonly($event.detail.value)" /></view>
            <view class="rate-demo-setting"><text class="rate-demo-setting-label">禁用</text><switch id="rate-disabled-switch" :checked="disabledEnabled" @change="setDisabled($event.detail.value)" /></view>
            <view class="rate-demo-setting"><text class="rate-demo-setting-label">可清空</text><switch id="rate-clearable-switch" :checked="clearableEnabled" @change="setClearable($event.detail.value)" /></view>
            <view class="rate-demo-setting"><text class="rate-demo-setting-label">允许滑动</text><switch id="rate-slide-switch" :checked="slideEnabled" @change="setSlide($event.detail.value)" /></view>
          </view>
          <XtfRate id="rate-stateful" v-model="stateScore" :readonly="readonlyEnabled" :disabled="disabledEnabled" :clearable="clearableEnabled" :allow-slide="slideEnabled" allow-half show-value show-text :texts="scoreTexts" @change="recordStateChange" />
          <text id="rate-state-result" class="rate-demo-value">{{ stateText }}</text>
        </view>

        <view class="rate-demo-section">
          <view class="rate-demo-section-head"><text class="rate-demo-heading">事件来源回显</text><text class="rate-demo-index">06</text></view>
          <text class="rate-demo-copy">changing / change / update:selected 分别显示实时值、提交值和来源。</text>
          <XtfRate id="rate-events" v-model="eventScore" allow-half allow-slide show-value @changing="recordEventChanging" @change="recordEventChange" @update:selected="recordSelected" />
          <text id="rate-event-changing" class="rate-demo-event">{{ changingText }}</text>
          <text id="rate-event-change" class="rate-demo-event">{{ committedText }}</text>
          <text id="rate-event-result" class="rate-demo-event">{{ eventSourceText }}</text>
        </view>

        <view class="rate-demo-section">
          <view class="rate-demo-section-head"><text class="rate-demo-heading">外部赋值与重置</text><text class="rate-demo-index">07</text></view>
          <text class="rate-demo-copy">通过外部状态赋值，验证 v-model 受控同步与重置。</text>
          <XtfRate id="rate-controlled" v-model="controlledScore" allow-half show-value show-text :texts="scoreTexts" />
          <view class="rate-demo-actions">
            <button id="rate-assign-button" class="rate-demo-button" size="mini" @tap="assignControlled">外部赋值 4.5</button>
            <button id="rate-reset-button" class="rate-demo-button rate-demo-button-light" size="mini" @tap="resetAll">重置所有评分</button>
          </view>
          <text id="rate-controlled-result" class="rate-demo-value">受控值: {{ controlledScore.toString() }} · 基础值: {{ score.toString() }}</text>
        </view>

        <view class="rate-demo-section">
          <view class="rate-demo-section-head"><text class="rate-demo-heading">尺寸与字符模式</text><text class="rate-demo-index">08</text></view>
          <text class="rate-demo-copy">数字及数字字符串按 rpx；sm / md / lg 为 32 / 40 / 48rpx；支持 px、rpx。零、负数与非法值回退 48rpx。</text>
          <view class="rate-demo-settings">
            <button v-for="(sample, index) in sizeSamples" :id="'rate-size-' + index" :key="index" class="rate-demo-button" size="mini" @tap="sampleSize = sample">{{ sample }}</button>
          </view>
          <XtfRate id="rate-size-preview" v-model="sampleScore" :size="sampleSize" :display-mode="sampleMode" allow-half show-value @update:selected="sampleEvent = JSON.stringify($event)" />
          <text id="rate-size-result" class="rate-demo-value">尺寸：{{ sampleSize }}；模式：{{ sampleMode }}</text>
          <view class="rate-demo-settings">
            <button v-for="mode in characterModes" :id="'rate-mode-' + mode" :key="mode" class="rate-demo-button" size="mini" @tap="sampleMode = mode">{{ mode }}</button>
          </view>
          <text id="rate-sample-event" class="rate-demo-event">{{ sampleEvent }}</text>
          <text class="rate-demo-copy">字符模式为 star / heart / diamond / bolt / flame / crown / shield / dot。thumb / pill / bar / block / ticket 几何形态及图片模式尚未实现；未知模式回退 star。</text>
        </view>
        <view class="rate-demo-section rate-demo-readonly-section">
          <view class="rate-demo-section-head"><text class="rate-demo-heading">只读结果联动</text><text class="rate-demo-index">08</text></view>
          <text class="rate-demo-copy">只读实例直接接收基础评分，不参与交互但始终反映当前结果。</text>
          <XtfRate id="rate-linked-readonly" :model-value="score" readonly show-value show-text :texts="scoreTexts" />
          <text id="rate-linked-result" class="rate-demo-value">当前业务结果: {{ score.toString() }} / 5</text>
        </view>
      </view>
    </scroll-view>
  </XtfConfigProvider>
</template>

<script setup lang="uts">
import { useDemoTheme } from '@/pages/demo-theme.uts'
const demoTheme = useDemoTheme()
import { ref } from "vue"
import XtfConfigProvider from "@/uni_modules/xtf-linkuiunix/components/xtf-config-provider/xtf-config-provider.uvue"
import XtfRate from "@/uni_modules/xtf-linkuiunix/components/xtf-rate/xtf-rate.uvue"

const score = ref(3)
const sampleSize = ref("48")
const sampleMode = ref("crown")
const sampleScore = ref(2.5)
const sampleEvent = ref("")
const sizeSamples = ["48", "sm", "md", "lg", "24px", "52rpx", "invalid", "-4", "0"] as string[]
const characterModes = ["star", "heart", "diamond", "bolt", "flame", "crown", "shield", "dot"] as string[]
const halfScore = ref(2.5)
const tenScore = ref(6.75)
const heartScore = ref(3.5)
const stateScore = ref(3.5)
const eventScore = ref(2)
const controlledScore = ref(1.5)
const readonlyEnabled = ref(false)
const disabledEnabled = ref(false)
const clearableEnabled = ref(true)
const slideEnabled = ref(true)
const eventText = ref("当前值: 3")
const stateText = ref("当前值: 3.5 · 点击或滑动评分")
const eventSourceText = ref("等待 changing / change / update:selected")
const changingText = ref("changing · 等待滑动")
const committedText = ref("change · 等待提交")
const scoreTexts = ["较差", "一般", "满意", "很好", "超赞"] as Array<string>

function recordChanging(value: number): void { eventText.value = "滑动中: " + value.toString() }
function recordChange(value: number): void { eventText.value = "已提交: " + value.toString() }
function recordHalf(value: number): void { halfScore.value = value }
function recordStateChange(value: number): void { stateText.value = "已提交: " + value.toString() + " · 状态开关仍可切换" }
function recordEventChanging(value: number): void { changingText.value = "changing · 实时值 " + value.toString() }
function recordEventChange(value: number): void { committedText.value = "change · 提交值 " + value.toString() }
function recordSelected(payload: any): void {
  const value = payload.value as number
  const source = payload.source as string
  eventSourceText.value = "update:selected · " + value.toString() + " · 来源 " + source
}
function setReadonly(value: boolean): void { readonlyEnabled.value = value }
function setDisabled(value: boolean): void { disabledEnabled.value = value }
function setClearable(value: boolean): void { clearableEnabled.value = value }
function setSlide(value: boolean): void { slideEnabled.value = value }
function assignControlled(): void { controlledScore.value = 4.5 }
function resetAll(): void {
  score.value = 3
  halfScore.value = 2.5
  tenScore.value = 6.75
  heartScore.value = 3.5
  stateScore.value = 3.5
  eventScore.value = 2
  controlledScore.value = 1.5
  eventText.value = "已重置 · 当前值: 3"
  stateText.value = "已重置 · 当前值: 3.5"
  eventSourceText.value = "已重置 · 等待评分事件"
  changingText.value = "changing · 等待滑动"
  committedText.value = "change · 等待提交"
}
</script>

<style>
.rate-demo-scroll { display: flex; flex-direction: column; flex: 1; width: 100%; height: 100%; min-height: 0; }
.rate-demo-page { display: flex; flex-direction: column; width: 100%; padding: 20rpx; background-color: var(--xtf-color-page, #f5f7fa); }
.rate-demo-header { display: flex; flex-direction: row; align-items: flex-end; justify-content: space-between; padding: 22rpx 4rpx 18rpx; border-bottom-width: 1rpx; border-bottom-style: solid; border-bottom-color: var(--xtf-color-border, #dbe2ea); }
.rate-demo-header-copy { display: flex; flex-direction: column; min-width: 0; }
.rate-demo-kicker { color: #0f766e; font-size: 18rpx; font-weight: 700; }
.rate-demo-title { margin-top: 4rpx; color: var(--xtf-color-text, #172033); font-size: 42rpx; font-weight: 700; line-height: 1.1; }
.rate-demo-intro { margin-top: 8rpx; color: var(--xtf-color-text-secondary, #64748b); font-size: 21rpx; }
.rate-demo-header-state { margin-left: 16rpx; color: #0f766e; font-size: 22rpx; font-weight: 700; }
.rate-demo-section { display: flex; flex-direction: column; margin-top: 16rpx; padding: 18rpx; border-width: 1rpx; border-style: solid; border-color: var(--xtf-color-border, #dbe2ea); border-radius: 8rpx; background-color: var(--xtf-color-surface, #ffffff); }
.rate-demo-section-head { display: flex; flex-direction: row; align-items: center; justify-content: space-between; }
.rate-demo-heading { color: var(--xtf-color-text, #172033); font-size: 28rpx; font-weight: 700; }
.rate-demo-index { color: var(--xtf-color-text-disabled, #94a3b8); font-size: 19rpx; font-weight: 700; }
.rate-demo-copy { margin-top: 8rpx; margin-bottom: 16rpx; color: var(--xtf-color-text-secondary, #64748b); font-size: 21rpx; line-height: 1.45; }
.rate-demo-value, .rate-demo-event { margin-top: 12rpx; color: var(--xtf-color-text-secondary, #475569); font-size: 22rpx; line-height: 1.4; }
.rate-demo-event { color: #0f766e; }
.rate-demo-settings { display: flex; flex-direction: row; flex-wrap: wrap; margin-bottom: 16rpx; }
.rate-demo-setting { display: flex; flex-direction: row; align-items: center; width: 50%; margin-top: 10rpx; }
.rate-demo-setting-label { flex: 1; color: var(--xtf-color-text-secondary, #334155); font-size: 22rpx; }
.rate-demo-actions { display: flex; flex-direction: row; margin-top: 16rpx; }
.rate-demo-button { flex: 1; margin: 0; margin-right: 10rpx; border-radius: 6rpx; background-color: #0f766e; color: #ffffff; font-size: 21rpx; }
.rate-demo-button-light { margin-right: 0; background-color: var(--xtf-color-surface-muted, #e2e8f0); color: var(--xtf-color-text-secondary, #334155); }
.rate-demo-readonly-section { margin-bottom: 24rpx; }
</style>
