import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:rhythm_box/providers/volume.dart';

class VolumeSlider extends StatelessWidget {
  final MainAxisAlignment mainAxisAlignment;

  const VolumeSlider({
    super.key,
    this.mainAxisAlignment = MainAxisAlignment.start,
  });

  @override
  Widget build(BuildContext context) {
    return Obx(() {
      final VolumeProvider vol = Get.find();

      final slider = Listener(
        onPointerSignal: (event) async {
          if (event is PointerScrollEvent) {
            if (event.scrollDelta.dy > 0) {
              final newValue = vol.volume.value - .2;
              vol.setVolume(newValue < 0 ? 0 : newValue);
            } else {
              final newValue = vol.volume.value + .2;
              vol.setVolume(newValue > 1 ? 1 : newValue);
            }
          }
        },
        child: SliderTheme(
          data: SliderThemeData(
            showValueIndicator: ShowValueIndicator.always,
            trackShape: _VolumeSliderShape(),
            trackHeight: 3,
            thumbShape: const RoundSliderThumbShape(
              enabledThumbRadius: 6,
            ),
            overlayShape: SliderComponentShape.noOverlay,
          ),
          child: Slider(
            min: 0,
            max: 1,
            label: (vol.volume.value * 100).toStringAsFixed(0),
            value: vol.volume.value,
            onChanged: vol.setVolume,
          ),
        ),
      ).paddingSymmetric(horizontal: 8);
      return Row(
        mainAxisAlignment: mainAxisAlignment,
        children: [
          IconButton(
            icon: Icon(
              vol.volume.value == 0
                  ? Icons.volume_off
                  : vol.volume.value <= 0.5
                      ? Icons.volume_down
                      : Icons.volume_up,
              size: 18,
            ),
            onPressed: () {
              if (vol.volume.value == 0) {
                vol.setVolume(1);
              } else {
                vol.setVolume(0);
              }
            },
          ),
          SizedBox(width: 100, child: slider),
        ],
      );
    });
  }
}

class _VolumeSliderShape extends RoundedRectSliderTrackShape {
  @override
  Rect getPreferredRect({
    required RenderBox parentBox,
    Offset offset = Offset.zero,
    required SliderThemeData sliderTheme,
    bool isEnabled = false,
    bool isDiscrete = false,
  }) {
    final trackHeight = sliderTheme.trackHeight;
    final trackLeft = offset.dx;
    final trackTop = offset.dy + (parentBox.size.height - trackHeight!) / 2;
    final trackWidth = parentBox.size.width;
    return Rect.fromLTWH(trackLeft, trackTop, trackWidth, trackHeight);
  }
}
