import 'package:flutter/material.dart';
import '../custom_widgets.dart'; // AutocompleteDropdown, HighlightText 등 사용

// 입력 필드 + 자동완성 드롭다운을 하나로 묶은 공통 위젯
class CategoryAutocompleteField extends StatefulWidget {
  // 입력 필드의 힌트 텍스트
  final String hintText;
  // 현재 선택된 값
  final String value;
  // 항목 리스트
  final List<String> items;
  // 필수 입력 여부
  final bool isRequired;
  // 선택 시 콜백
  final void Function(String) onSelect;
  // 입력값 변경 시 콜백(옵션)
  final void Function(String)? onChanged;
  // 비활성화 여부
  final bool enabled;

  const CategoryAutocompleteField({
    Key? key,
    required this.hintText,
    required this.value,
    required this.items,
    required this.onSelect,
    this.isRequired = false,
    this.onChanged,
    this.enabled = true,
  }) : super(key: key);

  @override
  State<CategoryAutocompleteField> createState() =>
      _CategoryAutocompleteFieldState();
}

class _CategoryAutocompleteFieldState extends State<CategoryAutocompleteField> {
  // 텍스트 입력 컨트롤러
  late final TextEditingController _controller;
  // 포커스 노드
  final FocusNode _focusNode = FocusNode();
  // 드롭다운 표시 여부
  bool _showDropdown = false;
  // 필터링된 항목 리스트
  List<String> _filteredItems = [];

  @override
  void initState() {
    super.initState();
    _controller = TextEditingController(text: widget.value);
    _filteredItems = List.from(widget.items);
    _controller.addListener(_onTextChanged);
    _focusNode.addListener(() {
      setState(() {
        if (_focusNode.hasFocus) {
          _showDropdown = _filteredItems.isNotEmpty;
        } else {
          _showDropdown = false;
        }
      });
    });
  }

  @override
  void didUpdateWidget(covariant CategoryAutocompleteField oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (widget.value != _controller.text) {
      _controller.text = widget.value;
    }
    if (widget.items != oldWidget.items) {
      _filteredItems = List.from(widget.items);
    }
  }

  @override
  void dispose() {
    _controller.dispose();
    _focusNode.dispose();
    super.dispose();
  }

  // 입력값 변경 시 필터링
  void _onTextChanged() {
    final String text = _controller.text;
    setState(() {
      if (text.isEmpty) {
        _filteredItems = List.from(widget.items);
      } else {
        _filteredItems =
            widget.items
                .where(
                  (item) => item.toLowerCase().contains(text.toLowerCase()),
                )
                .toList();
        // 시작 부분이 일치하는 항목 우선 정렬
        _filteredItems.sort((a, b) {
          bool aStartsWith = a.toLowerCase().startsWith(text.toLowerCase());
          bool bStartsWith = b.toLowerCase().startsWith(text.toLowerCase());
          if (aStartsWith && !bStartsWith) return -1;
          if (!aStartsWith && bStartsWith) return 1;
          return a.compareTo(b);
        });
      }
      _showDropdown = _filteredItems.isNotEmpty && _focusNode.hasFocus;
      if (widget.onChanged != null) {
        widget.onChanged!(text);
      }
    });
  }

  // 항목 선택 시 처리
  void _handleSelect(String value) {
    setState(() {
      _controller.text = value;
      _showDropdown = false;
    });
    widget.onSelect(value);
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        TextFormField(
          controller: _controller,
          focusNode: _focusNode,
          decoration: InputDecoration(
            hintText: widget.hintText,
            contentPadding: const EdgeInsets.symmetric(
              horizontal: 12,
              vertical: 12,
            ),
            suffixIcon:
                _controller.text.isNotEmpty
                    ? IconButton(
                      icon: const Icon(Icons.clear),
                      onPressed:
                          widget.enabled
                              ? () {
                                setState(() {
                                  _controller.clear();
                                  _filteredItems = List.from(widget.items);
                                  _showDropdown = _focusNode.hasFocus;
                                  widget.onSelect('');
                                });
                              }
                              : null,
                    )
                    : IconButton(
                      icon: const Icon(Icons.arrow_drop_down),
                      onPressed:
                          widget.enabled
                              ? () {
                                setState(() {
                                  _showDropdown = !_showDropdown;
                                });
                              }
                              : null,
                    ),
          ),
          enabled: widget.enabled,
          validator: (value) {
            if (widget.isRequired && (value == null || value.isEmpty)) {
              return '${widget.hintText}를 선택해주세요';
            }
            return null;
          },
          onTap: () {
            setState(() {
              if (!_showDropdown) {
                _showDropdown = true;
              }
            });
          },
        ),
        AutocompleteDropdown(
          items: _filteredItems,
          inputText: _controller.text,
          onSelect: _handleSelect,
          showDropdown: _showDropdown,
        ),
      ],
    );
  }
}
