import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import 'package:superport/screens/vendor/controllers/vendor_controller.dart';
import 'package:superport/screens/vendor/vendor_form_dialog.dart';
import 'package:superport/screens/vendor/components/vendor_search_filter.dart';
import 'package:superport/screens/common/layouts/base_list_screen.dart';
import 'package:superport/screens/common/widgets/standard_action_bar.dart';
import 'package:superport/screens/common/widgets/pagination.dart';
import 'package:superport/screens/common/theme_shadcn.dart';

class VendorListScreen extends StatefulWidget {
  const VendorListScreen({super.key});

  @override
  State<VendorListScreen> createState() => _VendorListScreenState();
}

class _VendorListScreenState extends State<VendorListScreen> {
  late VendorController _controller;

  @override
  void initState() {
    super.initState();
    _controller = context.read<VendorController>();
    // 위젯이 완전히 빌드된 후에 초기화 실행
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _controller.initialize();
    });
  }

  void _showCreateDialog() {
    showDialog(
      context: context,
      builder:
          (context) => VendorFormDialog(
            onSave: (vendor) async {
              final success = await _controller.createVendor(vendor);
              if (success) {
                if (mounted) {
                  Navigator.of(context).pop();
                  _showSuccessToast('벤더가 성공적으로 등록되었습니다.');
                }
              }
            },
          ),
    );
  }

  void _showEditDialog(int id) async {
    await _controller.selectVendor(id);
    if (_controller.selectedVendor != null && mounted) {
      showDialog(
        context: context,
        builder:
            (context) => VendorFormDialog(
              vendor: _controller.selectedVendor,
              onSave: (vendor) async {
                final success = await _controller.updateVendor(id, vendor);
                if (success) {
                  if (mounted) {
                    Navigator.of(context).pop();
                    _showSuccessToast('벤더가 성공적으로 수정되었습니다.');
                  }
                }
              },
            ),
      );
    }
  }

  void _showDeleteConfirmDialog(int id, String name) {
    showDialog(
      context: context,
      builder:
          (context) => ShadDialog(
            title: const Text('벤더 삭제'),
            description: Text('$name 벤더를 삭제하시겠습니까?\n삭제된 벤더는 복원할 수 있습니다.'),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.end,
              children: [
                ShadButton.outline(
                  onPressed: () => Navigator.of(context).pop(),
                  child: const Text('취소'),
                ),
                const SizedBox(width: 8),
                ShadButton(
                  onPressed: () async {
                    Navigator.of(context).pop();
                    final success = await _controller.deleteVendor(id);
                    if (success) {
                      _showSuccessToast('벤더가 삭제되었습니다.');
                    } else {
                      _showErrorToast(
                        _controller.errorMessage ?? '삭제에 실패했습니다.',
                      );
                    }
                  },
                  child: const Text('삭제'),
                ),
              ],
            ),
          ),
    );
  }

  void _showSuccessToast(String message) {
    ShadToaster.of(
      context,
    ).show(ShadToast(title: const Text('성공'), description: Text(message)));
  }

  void _showErrorToast(String message) {
    ShadToaster.of(context).show(
      ShadToast.destructive(
        title: const Text('오류'),
        description: Text(message),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: ShadcnTheme.background,
      appBar: AppBar(
        title: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('벤더 관리', style: ShadcnTheme.headingH4),
            Text('장비 제조사 및 공급업체를 관리합니다', style: ShadcnTheme.bodySmall),
          ],
        ),
        backgroundColor: ShadcnTheme.background,
        elevation: 0,
      ),
      body: Consumer<VendorController>(
        builder: (context, controller, child) {
          return BaseListScreen(
            headerSection: _buildStatisticsCards(controller),
            searchBar: _buildSearchBar(controller),
            actionBar: _buildActionBar(),
            dataTable: _buildDataTable(controller),
            pagination: _buildPagination(controller),
            isLoading: controller.isLoading,
            error: controller.errorMessage,
            onRefresh: () => controller.initialize(),
            // 데이터 테이블이 카드 좌우 아웃라인까지 꽉 차도록 내부 패딩 제거
            dataAreaPadding: EdgeInsets.zero,
          );
        },
      ),
    );
  }

  Widget _buildStatisticsCards(VendorController controller) {
    if (controller.isLoading) return const SizedBox();

    return Row(
      children: [
        _buildStatCard(
          '전체 벤더',
          controller.totalCount.toString(),
          Icons.business,
          ShadcnTheme.companyPartner,
        ),
        const SizedBox(width: ShadcnTheme.spacing4),
        _buildStatCard(
          '활성 벤더',
          controller.vendors.where((v) => !v.isDeleted).length.toString(),
          Icons.check_circle,
          ShadcnTheme.equipmentIn,
        ),
        const SizedBox(width: ShadcnTheme.spacing4),
        _buildStatCard(
          '비활성 벤더',
          controller.vendors.where((v) => v.isDeleted).length.toString(),
          Icons.cancel,
          ShadcnTheme.equipmentDisposal,
        ),
      ],
    );
  }

  Widget _buildSearchBar(VendorController controller) {
    return VendorSearchFilter(
      onSearch: (query) {
        controller.setSearchQuery(query);
        controller.search();
      },
      onFilterChanged: (isActive) {
        controller.setFilterIsActive(isActive);
        controller.applyFilters();
      },
      onClearFilters: () {
        controller.clearFilters();
      },
    );
  }

  Widget _buildActionBar() {
    return StandardActionBar(
      totalCount: _controller.totalCount,
      leftActions: const [
        Text(
          '벤더 목록',
          style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
        ),
      ],
      rightActions: [
        ShadButton(
          onPressed: _showCreateDialog,
          child: const Row(
            mainAxisSize: MainAxisSize.min,
            children: [
              Icon(Icons.add, size: 16),
              SizedBox(width: ShadcnTheme.spacing1),
              Text('벤더 등록'),
            ],
          ),
        ),
      ],
    );
  }

  Widget _buildDataTable(VendorController controller) {
    final vendors = controller.vendors;

    if (vendors.isEmpty) {
      return Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Icon(
              Icons.business_outlined,
              size: 64,
              color: ShadcnTheme.mutedForeground,
            ),
            const SizedBox(height: ShadcnTheme.spacing4),
            Text(
              '등록된 벤더가 없습니다',
              style: ShadcnTheme.bodyMedium.copyWith(
                color: ShadcnTheme.mutedForeground,
              ),
            ),
          ],
        ),
      );
    }

    return Container(
      decoration: BoxDecoration(
        border: Border.all(color: ShadcnTheme.border),
        borderRadius: BorderRadius.circular(ShadcnTheme.radiusMd),
      ),
      child: Padding(
        // 수평 패딩을 제거해 테이블이 카드 내부 전체 폭을 사용하도록 함
        padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 12.0),
        // 가용 너비를 최대로 활용하고, 필요 시 수평 스크롤 허용
        child: LayoutBuilder(
          builder: (context, constraints) {
            // 컬럼 대략 폭 합: 번호(64) + 벤더명(320) + 등록일(120) + 상태(100) + 작업(256) + 여백
            const double actionsW = 256.0; // 아이콘 2개 + 내부 패딩 여유(단일 행 유지)
            const double minTableWidth = 64 + 320 + 120 + 100 + actionsW + 24;
            final double tableWidth =
                constraints.maxWidth > 0
                    ? (constraints.maxWidth >= minTableWidth
                        ? constraints.maxWidth
                        : minTableWidth)
                    : minTableWidth;

            const double nameBaseWidth = 320.0;
            final double nameColumnWidth = nameBaseWidth; // 벤더명 고정 폭

            // 스크롤이 필요 없는 경우: 수평 스크롤 제거, 전체 폭 사용
            if (constraints.maxWidth >= minTableWidth) {
              return SizedBox(
                width: constraints.maxWidth,
                child: ShadTable.list(
                  // 0: 번호, 1: 벤더명(고정), 2: 등록일, 3: 상태, 4: 작업, 5: 여백(남는 폭 흡수)
                  columnSpanExtent: (index) {
                    switch (index) {
                      case 0:
                        return const FixedTableSpanExtent(64);
                      case 1:
                        return const FixedTableSpanExtent(nameBaseWidth);
                      case 2:
                        return const FixedTableSpanExtent(120);
                      case 3:
                        return const FixedTableSpanExtent(100);
                      case 4:
                        return const FixedTableSpanExtent(actionsW);
                      case 5:
                        return const RemainingTableSpanExtent();
                      default:
                        return const FixedTableSpanExtent(100);
                    }
                  },
                  header: [
                    const ShadTableCell.header(child: Text('번호')),
                    ShadTableCell.header(
                      child: SizedBox(
                        width: nameColumnWidth,
                        child: const Text('벤더명'),
                      ),
                    ),
                    ShadTableCell.header(child: SizedBox(width: 120, child: const Text('등록일'))),
                    ShadTableCell.header(child: SizedBox(width: 100, child: const Text('상태'))),
                    ShadTableCell.header(
                      child: SizedBox(width: actionsW, child: const Text('작업')),
                    ),
                    const ShadTableCell.header(child: SizedBox.shrink()),
                  ],
                  children: [
                    for (int index = 0; index < vendors.length; index++)
                      [
                        // 번호
                        ShadTableCell(
                          child: Text(
                            (((_controller.currentPage - 1) *
                                        _controller.pageSize) +
                                    index +
                                    1)
                                .toString(),
                            style: ShadcnTheme.bodySmall,
                          ),
                        ),
                        // 벤더명 (가변 폭, 말줄임)
                        ShadTableCell(
                          child: SizedBox(
                            width: nameColumnWidth,
                            child: Text(
                              vendors[index].name,
                              overflow: TextOverflow.ellipsis,
                            ),
                          ),
                        ),
                        // 등록일
                        ShadTableCell(
                          child: SizedBox(
                            width: 120,
                            child: Text(
                              vendors[index].createdAt != null
                                  ? DateFormat('yyyy-MM-dd').format(vendors[index].createdAt!)
                                  : '-',
                              style: ShadcnTheme.bodySmall,
                              maxLines: 1,
                              softWrap: false,
                              overflow: TextOverflow.clip,
                            ),
                          ),
                        ),
                        // 상태
                        ShadTableCell(
                          child: SizedBox(width: 100, child: _buildStatusChip(vendors[index].isDeleted)),
                        ),
                        // 작업 (아이콘 그룹 - 단일 행 유지)
                        ShadTableCell(
                          child: SizedBox(
                            width: actionsW,
                            child: FittedBox(
                              alignment: Alignment.centerLeft,
                              fit: BoxFit.scaleDown,
                              child: Row(
                                mainAxisSize: MainAxisSize.min,
                                children: [
                                  ShadButton.ghost(
                                    size: ShadButtonSize.sm,
                                    onPressed: () => _showEditDialog(vendors[index].id!),
                                    child: const Icon(Icons.edit, size: 16),
                                  ),
                                  const SizedBox(width: ShadcnTheme.spacing1),
                                  ShadButton.ghost(
                                    size: ShadButtonSize.sm,
                                    onPressed: () => _showDeleteConfirmDialog(vendors[index].id!, vendors[index].name),
                                    child: Icon(Icons.delete, size: 16, color: ShadcnTheme.destructive),
                                  ),
                                ],
                              ),
                            ),
                          ),
                        ),
                        // 남는 폭 흡수용 빈 컬럼(전폭 사용)
                        const ShadTableCell(child: SizedBox.shrink()),
                      ],
                  ],
                ),
              );
            }

            // 스크롤이 필요한 경우만 수평 스크롤 사용
            return SingleChildScrollView(
              scrollDirection: Axis.horizontal,
              child: SizedBox(
                width: tableWidth,
                child: ShadTable.list(
                  // 작은 화면에서도 최소 폭을 지키도록 고정 폭 지정
                  columnSpanExtent: (index) {
                    switch (index) {
                      case 0:
                        return const FixedTableSpanExtent(64);
                      case 1:
                        return const FixedTableSpanExtent(nameBaseWidth);
                      case 2:
                        return const FixedTableSpanExtent(120);
                      case 3:
                        return const FixedTableSpanExtent(100);
                      case 4:
                        return const FixedTableSpanExtent(actionsW);
                      default:
                        return const FixedTableSpanExtent(100);
                    }
                  },
                  header: [
                    const ShadTableCell.header(child: Text('번호')),
                    ShadTableCell.header(
                      child: SizedBox(
                        width: nameColumnWidth,
                        child: const Text('벤더명'),
                      ),
                    ),
                    ShadTableCell.header(child: SizedBox(width: 120, child: const Text('등록일'))),
                    ShadTableCell.header(child: SizedBox(width: 100, child: const Text('상태'))),
                    ShadTableCell.header(
                      child: SizedBox(width: actionsW, child: const Text('작업')),
                    ),
                  ],
                  children: [
                    for (int index = 0; index < vendors.length; index++)
                      [
                        // 번호
                        ShadTableCell(
                          child: Text(
                            (((_controller.currentPage - 1) *
                                        _controller.pageSize) +
                                    index +
                                    1)
                                .toString(),
                            style: ShadcnTheme.bodySmall,
                          ),
                        ),
                        // 벤더명 (가변 폭, 말줄임)
                        ShadTableCell(
                          child: SizedBox(
                            width: nameColumnWidth,
                            child: Text(
                              vendors[index].name,
                              overflow: TextOverflow.ellipsis,
                            ),
                          ),
                        ),
                        // 등록일
                        ShadTableCell(
                          child: SizedBox(
                            width: 120,
                            child: Text(
                              vendors[index].createdAt != null
                                  ? DateFormat('yyyy-MM-dd').format(vendors[index].createdAt!)
                                  : '-',
                              style: ShadcnTheme.bodySmall,
                              maxLines: 1,
                              softWrap: false,
                              overflow: TextOverflow.clip,
                            ),
                          ),
                        ),
                        // 상태
                        ShadTableCell(
                          child: SizedBox(width: 100, child: _buildStatusChip(vendors[index].isDeleted)),
                        ),
                        // 작업 (아이콘 그룹 - 단일 행 유지)
                        ShadTableCell(
                          child: SizedBox(
                            width: actionsW,
                            child: FittedBox(
                              alignment: Alignment.centerLeft,
                              fit: BoxFit.scaleDown,
                              child: Row(
                                mainAxisSize: MainAxisSize.min,
                                children: [
                                  ShadButton.ghost(
                                    size: ShadButtonSize.sm,
                                    onPressed: () => _showEditDialog(vendors[index].id!),
                                    child: const Icon(Icons.edit, size: 16),
                                  ),
                                  const SizedBox(width: ShadcnTheme.spacing1),
                                  ShadButton.ghost(
                                    size: ShadButtonSize.sm,
                                    onPressed: () => _showDeleteConfirmDialog(vendors[index].id!, vendors[index].name),
                                    child: Icon(Icons.delete, size: 16, color: ShadcnTheme.destructive),
                                  ),
                                ],
                              ),
                            ),
                          ),
                        ),
                        // 별도 필러 컬럼 없이 벤더명 컬럼으로 남는 공간을 흡수
                      ],
                  ],
                ),
              ),
            );
          },
        ),
      ),
    );
  }

  Widget _buildPagination(VendorController controller) {
    return Pagination(
      currentPage: controller.currentPage,
      totalCount: controller.totalCount,
      pageSize: controller.pageSize,
      onPageChanged: controller.goToPage,
    );
  }

  Widget _buildStatCard(
    String title,
    String value,
    IconData icon,
    Color color,
  ) {
    return Expanded(
      child: ShadCard(
        child: Padding(
          padding: const EdgeInsets.all(ShadcnTheme.spacing4),
          child: Row(
            children: [
              Container(
                padding: const EdgeInsets.all(ShadcnTheme.spacing3),
                decoration: BoxDecoration(
                  color: color.withValues(alpha: 0.1),
                  borderRadius: BorderRadius.circular(ShadcnTheme.radiusLg),
                ),
                child: Icon(icon, color: color, size: 20),
              ),
              const SizedBox(width: ShadcnTheme.spacing3),
              Expanded(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Text(title, style: ShadcnTheme.bodySmall),
                    Text(
                      value,
                      style: ShadcnTheme.headingH6.copyWith(color: color),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Widget _buildStatusChip(bool isDeleted) {
    if (isDeleted) {
      return ShadBadge(
        backgroundColor: ShadcnTheme.equipmentDisposal.withValues(alpha: 0.1),
        foregroundColor: ShadcnTheme.equipmentDisposal,
        child: const Text('비활성'),
      );
    } else {
      return ShadBadge(
        backgroundColor: ShadcnTheme.equipmentIn.withValues(alpha: 0.1),
        foregroundColor: ShadcnTheme.equipmentIn,
        child: const Text('활성'),
      );
    }
  }
}
