import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:tdesign_flutter/tdesign_flutter.dart';
import 'package:easy_refresh/easy_refresh.dart';
import '../shell/nav_bar_config.dart';
import '../../core/theme/app_colors.dart';
import '../../core/utils/date_utils.dart' as du;
import '../../core/utils/responsive.dart';
import '../../shared/widgets/list_card.dart';
import '../../shared/widgets/status_tag.dart';
import '../../shared/widgets/empty_state.dart';
import '../../shared/widgets/skeleton_list_card.dart';
import '../../shared/widgets/filter_bar.dart';
import '../../core/i18n/app_localizations.dart';
import 'expense_application_list_controller.dart';
import 'expense_application_model.dart';

class ExpenseApplicationListPage extends ConsumerStatefulWidget {
  const ExpenseApplicationListPage({super.key});
  @override
  ConsumerState<ExpenseApplicationListPage> createState() =>
      _ExpenseApplicationListPageState();
}

class _ExpenseApplicationListPageState
    extends ConsumerState<ExpenseApplicationListPage>
    with TickerProviderStateMixin {
  static const _tabLabels = ['全部', '草稿', '审批中', '已通过', '已拒绝', '已撤回'];
  static const _tabKeys = ['', 'draft', 'pending', 'approved', 'rejected', 'revoked'];

  late final TabController _tabCtrl;

  @override
  void initState() {
    super.initState();
    _tabCtrl = TabController(length: _tabLabels.length, vsync: this);
    _tabCtrl.addListener(() {
      if (!_tabCtrl.indexIsChanging) {
        ref.read(expenseApplyStatusFilterProvider.notifier).state =
            _tabKeys[_tabCtrl.index];
      }
    });
  }

  @override
  void dispose() {
    _tabCtrl.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final status = ref.watch(expenseApplyStatusFilterProvider);
    final dateStart = ref.watch(expenseApplyDateStartProvider);
    final dateEnd = ref.watch(expenseApplyDateEndProvider);
    ref.watch(expenseApplyTypeFilterProvider);
    ref.watch(expenseApplyUrgencyFilterProvider);
    final l10n = AppLocalizations.of(context);

    ref.read(navBarConfigProvider.notifier).update(
          NavBarConfig(
            title: l10n.get('expenseApplyList'),
            showBack: true,
            onBack: () => context.pop(),
          ),
        );

    // Sync TabController when external filter changes
    final targetIdx = _tabKeys.indexOf(status);
    if (targetIdx >= 0 && _tabCtrl.index != targetIdx && !_tabCtrl.indexIsChanging) {
      WidgetsBinding.instance.addPostFrameCallback((_) {
        if (mounted) _tabCtrl.animateTo(targetIdx);
      });
    }

    return Column(
      children: [
        Container(
          color: AppColors.bgCard,
          padding: const EdgeInsets.symmetric(horizontal: 8),
          child: TDTabBar(
            tabs: _tabLabels.map((l) => TDTab(text: l)).toList(),
            controller: _tabCtrl,
            labelColor: AppColors.primary,
            unselectedLabelColor: AppColors.textSecondary,
            outlineType: TDTabBarOutlineType.filled,
            showIndicator: true,
            indicatorColor: AppColors.primary,
            indicatorHeight: 3,
            dividerHeight: 0,
            isScrollable: true,
            labelPadding: const EdgeInsets.symmetric(horizontal: 12),
            onTap: (index) {
              ref.invalidate(expenseApplicationListProvider);
              ref.read(expenseApplyStatusFilterProvider.notifier).state =
                  _tabKeys[index];
            },
          ),
        ),
        // 筛选栏（TDesign 组件）
        FilterBar(
          groups: [
            FilterGroup(title: '日期范围', type: FilterGroupType.dateRange, sections: [
              FilterSection(
                label: '起始日期',
                type: FilterSectionType.dateRange,
                startDate: dateStart,
                endDate: dateEnd,
                onStartChanged: (v) =>
                    ref.read(expenseApplyDateStartProvider.notifier).state = v,
                onEndChanged: (v) =>
                    ref.read(expenseApplyDateEndProvider.notifier).state = v,
              ),
              FilterSection(
                label: '结束日期',
                type: FilterSectionType.dateRange,
                startDate: dateStart,
                endDate: dateEnd,
                onStartChanged: (v) =>
                    ref.read(expenseApplyDateStartProvider.notifier).state = v,
                onEndChanged: (v) =>
                    ref.read(expenseApplyDateEndProvider.notifier).state = v,
              ),
            ]),
            FilterGroup(title: '其它', type: FilterGroupType.other, sections: [
              FilterSection(
                label: '费用类型',
                type: FilterSectionType.multiSelect,
                options: const [
                  FilterOption(value: 'travel', label: '差旅费'),
                  FilterOption(value: 'entertainment', label: '业务招待费'),
                  FilterOption(value: 'office', label: '办公费'),
                  FilterOption(value: 'meeting', label: '会议费'),
                ],
                onMultiChanged: (v) =>
                    ref.read(expenseApplyTypeFilterProvider.notifier).state =
                        v.isNotEmpty ? v.first : null,
              ),
              FilterSection(
                label: '紧急程度',
                type: FilterSectionType.singleSelect,
                options: const [
                  FilterOption(value: 'normal', label: '普通'),
                  FilterOption(value: 'urgent', label: '紧急'),
                  FilterOption(value: 'critical', label: '特急'),
                ],
                onChanged: (v) =>
                    ref.read(expenseApplyUrgencyFilterProvider.notifier).state = v,
              ),
            ]),
          ],
          onReset: () {
            ref.read(expenseApplyDateStartProvider.notifier).state = null;
            ref.read(expenseApplyDateEndProvider.notifier).state = null;
            ref.read(expenseApplyTypeFilterProvider.notifier).state = null;
            ref.read(expenseApplyUrgencyFilterProvider.notifier).state = null;
          },
          onConfirm: () {},
        ),
        Expanded(
          child: TabBarView(
            controller: _tabCtrl,
            children: List.generate(_tabKeys.length, (tabIdx) {
              return _buildTabContent(tabIdx);
            }),
          ),
        ),
      ],
    );
  }

  Widget _buildTabContent(int tabIdx) {
    final r = ResponsiveHelper.of(context);
    final statusKey = _tabKeys[tabIdx];

    return Center(
      child: ConstrainedBox(
        constraints: BoxConstraints(maxWidth: r.listMaxWidth),
        child: _ExpenseApplyList(
          statusKey: statusKey,
          tabIdx: tabIdx,
        ),
      ),
    );
  }
}

class _ExpenseApplyList extends ConsumerWidget {
  final String statusKey;
  final int tabIdx;

  const _ExpenseApplyList({
    required this.statusKey,
    required this.tabIdx,
  });

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final itemsAsync = ref.watch(expenseApplicationListProvider(statusKey));

    // 首次加载该 tab：骨架
    if (itemsAsync.isLoading && !itemsAsync.hasValue) {
      return const SkeletonLoadingList();
    }

    // 其他情况统一 EasyRefresh
    return EasyRefresh(
      header: TDRefreshHeader(),
      onRefresh: () async {
        ref.read(expenseApplyRefreshProvider.notifier).state++;
      },
      child: _buildContent(itemsAsync, context, ref),
    );
  }

  Widget _buildContent(
    AsyncValue<List<ExpenseApplicationModel>> itemsAsync,
    BuildContext context,
    WidgetRef ref,
  ) {
    // 重新加载中（下拉刷新/筛选变化）：保留旧数据
    if (itemsAsync.isReloading) {
      final oldItems = itemsAsync.valueOrNull ?? [];
      if (oldItems.isEmpty) return const SkeletonLoadingList();
      return ListView.builder(
        padding: const EdgeInsets.fromLTRB(16, 16, 16, 24),
        itemCount: oldItems.length,
        itemBuilder: (_, i) => Padding(
          padding: const EdgeInsets.only(bottom: 16),
          child: ListCard(
            cardNo: oldItems[i].applicationNo,
            amount: '¥${oldItems[i].estimatedAmount.toStringAsFixed(2)}',
            description: '${oldItems[i].expenseType} — ${oldItems[i].purpose}',
            date: du.DateUtils.formatDate(oldItems[i].createTime),
            statusTag: StatusTag.fromStatus(oldItems[i].status),
            onTap: () => context.push('/expense-apply/detail/${oldItems[i].id}'),
          ),
        ),
      );
    }

    if (itemsAsync.hasError) {
      return ListView(
        children: const [
          SizedBox(height: 120),
          EmptyState(message: '加载失败'),
        ],
      );
    }

    final items = itemsAsync.requireValue;
    if (items.isEmpty) {
      return ListView(
        children: const [
          SizedBox(height: 120),
          EmptyState(message: '暂无报销申请'),
        ],
      );
    }

    return ListView.builder(
      padding: const EdgeInsets.fromLTRB(16, 16, 16, 24),
      itemCount: items.length,
      itemBuilder: (_, i) => Padding(
        padding: const EdgeInsets.only(bottom: 16),
        child: ListCard(
          cardNo: items[i].applicationNo,
          amount: '¥${items[i].estimatedAmount.toStringAsFixed(2)}',
          description: '${items[i].expenseType} — ${items[i].purpose}',
          date: du.DateUtils.formatDate(items[i].createTime),
          statusTag: StatusTag.fromStatus(items[i].status),
          onTap: () => context.push('/expense-apply/detail/${items[i].id}'),
        ),
      ),
    );
  }
}
