import 'package:flutter/material.dart';
import 'dart:math' as math;

class GappedContainerShape extends StatelessWidget {
  final Color? activeColor;
  final Color? inActiveColor;
  final double? trackGapWidth;
  final double thumbPosition;

  const GappedContainerShape({
    this.activeColor,
    this.inActiveColor,
    this.trackGapWidth,
    required this.thumbPosition,
    super.key,
  });

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      painter: _GappedContainerPainter(
        activeColor:
            activeColor ?? Theme.of(context).sliderTheme.activeTrackColor ?? Theme.of(context).colorScheme.primary,
        inActiveColor: inActiveColor ??
            Theme.of(context).sliderTheme.inactiveTrackColor ??
            Theme.of(context).colorScheme.secondaryContainer,
        trackGapWidth: trackGapWidth ?? 18,
        thumbCenterDxFraction: thumbPosition,
      ),
      child: Container(),
    );
  }
}

class _GappedContainerPainter extends CustomPainter {
  final Color activeColor;
  final Color inActiveColor;
  final double trackGapWidth;
  final double thumbCenterDxFraction;

  _GappedContainerPainter({
    required this.activeColor,
    required this.inActiveColor,
    required this.trackGapWidth,
    required this.thumbCenterDxFraction,
  });

  @override
  void paint(Canvas canvas, Size size) {
    final Paint paint = Paint()
      ..color = activeColor // Change this to the desired color
      ..style = PaintingStyle.fill;
    final Paint inActive = Paint()
      ..color = inActiveColor // Change this to the desired color
      ..style = PaintingStyle.fill;

    final Rect trackRect = Offset.zero & size;

    // Ensure thumbCenterDxFraction is not NaN or Infinity
    final double thumbCenterDx =
        thumbCenterDxFraction.isFinite ? thumbCenterDxFraction * size.width : 0.0; // Default to 0 if invalid fraction

    final Radius trackCornerRadius = Radius.circular(trackRect.shortestSide / 2);
    final Radius trackInsideCornerRadius = const Radius.circular(2.0);

    final RRect trackRRect = RRect.fromRectAndCorners(
      trackRect,
      topLeft: trackCornerRadius,
      bottomLeft: trackCornerRadius,
      topRight: trackCornerRadius,
      bottomRight: trackCornerRadius,
    );

    final RRect leftRRect = RRect.fromLTRBAndCorners(
      trackRect.left,
      trackRect.top,
      math.max(trackRect.left, thumbCenterDx - trackGapWidth / 2),
      trackRect.bottom,
      topLeft: trackCornerRadius,
      bottomLeft: trackCornerRadius,
      topRight: trackInsideCornerRadius,
      bottomRight: trackInsideCornerRadius,
    );

    final RRect rightRRect = RRect.fromLTRBAndCorners(
      thumbCenterDx + trackGapWidth / 2,
      trackRect.top,
      trackRect.right,
      trackRect.bottom,
      topRight: trackCornerRadius,
      bottomRight: trackCornerRadius,
      topLeft: trackInsideCornerRadius,
      bottomLeft: trackInsideCornerRadius,
    );

    canvas
      ..save()
      ..clipRRect(trackRRect);
    canvas.drawRRect(leftRRect, paint);
    canvas.drawRRect(rightRRect, inActive);
    canvas.restore();
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false;
  }
}
