import 'dart:ui' as ui;

import 'package:flutter/material.dart';

import 'package:random/config/app_colors.dart';
import 'package:random/utils/color_extensions.dart';

class CellPainter extends CustomPainter {
  const CellPainter({required this.value});

  final int value;

  Color getIndexedColor(int index) {
    const List<Color> availableColors = [
      AppColors.contentColorCyan,
      AppColors.contentColorGreen,
      AppColors.contentColorOrange,
      AppColors.contentColorPurple,
      AppColors.contentColorYellow,
      AppColors.contentColorPink,
      AppColors.contentColorWhite,
    ];

    return availableColors[index % availableColors.length];
  }

  @override
  void paint(Canvas canvas, Size size) {
    final baseColor = getIndexedColor(value);

    const borderWidth = 0.05;

    final Rect baseSquare =
        Rect.fromPoints(const Offset(0, 0), Offset(size.width, size.height));

    final paintBaseSquare = Paint()
      ..style = PaintingStyle.fill
      ..color = baseColor.darken(40);

    canvas.drawRect(baseSquare, paintBaseSquare);

    final Rect innerGradientBackground = Rect.fromPoints(
        Offset(size.width * borderWidth, size.height * borderWidth),
        Offset(size.width * (1 - borderWidth), size.height * (1 - borderWidth)));

    final paintInnerBackground = Paint()
      ..shader = ui.Gradient.linear(
        baseSquare.topCenter,
        baseSquare.bottomCenter,
        [
          baseColor.lighten(10),
          baseColor.darken(20),
        ],
      );

    canvas.drawRect(innerGradientBackground, paintInnerBackground);
  }

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