import 'package:flutter/material.dart';

class DashDemo extends StatefulWidget {
  final ValueNotifier<String> text;

  const DashDemo({super.key, required this.text});

  @override
  State<DashDemo> createState() => _DashDemoState();
}

class _DashDemoState extends State<DashDemo> {
  final double textFieldHeight = 80;
  final Color colorPrimary = Colors.blue.shade700;
  late TextEditingController textController;

  int totalCharCount = 0;

  @override
  void initState() {
    super.initState();
    // Initial value of the text box
    totalCharCount = widget.text.value.length;
    textController = TextEditingController.fromValue(TextEditingValue(
        text: widget.text.value,
        selection: TextSelection.collapsed(offset: widget.text.value.length)));
    // Report changes
    textController.addListener(_onTextControllerChange);
    // Listen to changes from the outside
    widget.text.addListener(_onTextStateChanged);
  }

  void _onTextControllerChange() {
    widget.text.value = textController.text;
    setState(() {
      totalCharCount = textController.text.length;
    });
  }

  void _onTextStateChanged() {
    textController.value = TextEditingValue(
      text: widget.text.value,
      selection: TextSelection.collapsed(offset: widget.text.value.length),
    );
  }

  @override
  void dispose() {
    super.dispose();
    textController.dispose();
    widget.text.removeListener(_onTextStateChanged);
  }

  void _handleClear() {
    textController.value = TextEditingValue(
      text: '',
      selection: TextSelection.collapsed(offset: widget.text.value.length),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Expanded(
            child: Container(
              width: double.infinity,
              color: colorPrimary,
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text(
                    'COUNT WITH DASH!',
                    style: Theme.of(context).textTheme.titleLarge!.copyWith(
                          color: Colors.white,
                        ),
                  ),
                  // Bordered dash avatar
                  Padding(
                    padding: const EdgeInsets.all(12),
                    child: ClipOval(
                      child: Container(
                          color: Colors.white,
                          padding: const EdgeInsets.all(2),
                          child: ClipOval(
                            child: Container(
                                color: colorPrimary,
                                padding: const EdgeInsets.all(2),
                                child: const CircleAvatar(
                                  radius: 45,
                                  backgroundColor: Colors.white,
                                  foregroundImage:
                                      AssetImage('assets/dash.png'),
                                )),
                          )),
                    ),
                  ),
                  Text(
                    '$totalCharCount',
                    style: Theme.of(context).textTheme.displayLarge!.copyWith(
                          color: Colors.white,
                        ),
                  ),
                ],
              ),
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(12),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    autofocus: true,
                    controller: textController,
                    maxLines: 1,
                    decoration: const InputDecoration(
                      border: OutlineInputBorder(),
                      hintText: 'Type something!',
                    ),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.only(left: 12),
                  child: Ink(
                    decoration: ShapeDecoration(
                      color: colorPrimary,
                      shape: const CircleBorder(),
                    ),
                    child: IconButton(
                      icon: const Icon(Icons.refresh),
                      color: Colors.white,
                      onPressed: _handleClear,
                    ),
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}