using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CarManagerV3
{
    public class AnimatedProgressBar : UserControl
    {
        private Timer animationTimer;
        private float animationPosition = 0f;
        private Color primaryColor = Color.FromArgb(0, 120, 215);
        private Color secondaryColor = Color.FromArgb(100, 180, 255);
        private Color backgroundColor = Color.FromArgb(240, 240, 240);

        public AnimatedProgressBar()
        {
            this.SetStyle(
                ControlStyles.AllPaintingInWmPaint |
                ControlStyles.UserPaint |
                ControlStyles.OptimizedDoubleBuffer |
                ControlStyles.ResizeRedraw,
                true);

            this.Height = 8;

            // Initialize animation timer
            animationTimer = new Timer();
            animationTimer.Interval = 20; // 50 FPS
            animationTimer.Tick += AnimationTimer_Tick;
            animationTimer.Start();
        }

        private void AnimationTimer_Tick(object sender, EventArgs e)
        {
            animationPosition += 2f;
            if (animationPosition > this.Width + 100)
            {
                animationPosition = -100;
            }
            this.Invalidate();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;

            // Draw background with rounded corners
            using (GraphicsPath path = GetRoundedRect(ClientRectangle, 4))
            {
                using (SolidBrush bgBrush = new SolidBrush(backgroundColor))
                {
                    g.FillPath(bgBrush, path);
                }
            }

            // Create animated gradient bar
            float barWidth = 100f;
            RectangleF barRect = new RectangleF(animationPosition, 0, barWidth, this.Height);

            if (barRect.Right > 0 && barRect.Left < this.Width)
            {
                using (GraphicsPath barPath = GetRoundedRect(barRect, 4))
                {
                    // Create gradient brush
                    using (LinearGradientBrush gradientBrush = new LinearGradientBrush(
                        barRect,
                        Color.Transparent,
                        Color.Transparent,
                        LinearGradientMode.Horizontal))
                    {
                        ColorBlend colorBlend = new ColorBlend();
                        colorBlend.Colors = new Color[] {
                            Color.FromArgb(0, primaryColor),
                            primaryColor,
                            secondaryColor,
                            primaryColor,
                            Color.FromArgb(0, primaryColor)
                        };
                        colorBlend.Positions = new float[] { 0f, 0.2f, 0.5f, 0.8f, 1f };
                        gradientBrush.InterpolationColors = colorBlend;

                        // Clip to control bounds
                        Region oldClip = g.Clip;
                        using (GraphicsPath clipPath = GetRoundedRect(ClientRectangle, 4))
                        {
                            g.SetClip(clipPath);
                            g.FillPath(gradientBrush, barPath);
                            g.Clip = oldClip;
                        }
                    }
                }
            }

            // Draw subtle border
            using (GraphicsPath borderPath = GetRoundedRect(ClientRectangle, 4))
            {
                using (Pen borderPen = new Pen(Color.FromArgb(220, 220, 220), 1))
                {
                    g.DrawPath(borderPen, borderPath);
                }
            }
        }

        private GraphicsPath GetRoundedRect(RectangleF rect, float radius)
        {
            GraphicsPath path = new GraphicsPath();
            float diameter = radius * 2;

            path.AddArc(rect.X, rect.Y, diameter, diameter, 180, 90);
            path.AddArc(rect.Right - diameter, rect.Y, diameter, diameter, 270, 90);
            path.AddArc(rect.Right - diameter, rect.Bottom - diameter, diameter, diameter, 0, 90);
            path.AddArc(rect.X, rect.Bottom - diameter, diameter, diameter, 90, 90);
            path.CloseFigure();

            return path;
        }

        public void StartAnimation()
        {
            animationTimer.Start();
        }

        public void StopAnimation()
        {
            animationTimer.Stop();
        }

        //protected override void Dispose(bool disposing)
        //{
        //    if (disposing)
        //    {
        //        animationTimer?.Stop();
        //        animationTimer?.Dispose();
        //    }
        //    base.Dispose(disposing);
        //}

        // Properties for customization
        public Color PrimaryColor
        {
            get => primaryColor;
            set
            {
                primaryColor = value;
                this.Invalidate();
            }
        }

        public Color SecondaryColor
        {
            get => secondaryColor;
            set
            {
                secondaryColor = value;
                this.Invalidate();
            }
        }

        public Color ProgressBackColor
        {
            get => backgroundColor;
            set
            {
                backgroundColor = value;
                this.Invalidate();
            }
        }
    }
}
