import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:hangman/config/default_activity_settings.dart';
import 'package:hangman/models/settings/settings_activity.dart';
import 'package:hangman/models/settings/settings_global.dart';

class ParameterPainter extends CustomPainter {
  const ParameterPainter({
    required this.code,
    required this.value,
    required this.activitySettings,
    required this.globalSettings,
  });

  final String code;
  final String value;
  final ActivitySettings activitySettings;
  final GlobalSettings globalSettings;

  @override
  void paint(Canvas canvas, Size size) {
    // force square
    final double canvasSize = min(size.width, size.height);

    // content
    switch (code) {
      case DefaultActivitySettings.parameterCodeGameMode:
        paintGameModeParameterItem(canvas, canvasSize);
        break;
      case DefaultActivitySettings.parameterCodeGameLevel:
        paintGameLevelParameterItem(canvas, canvasSize);
        break;
      default:
        printlog('Unknown parameter: $code/$value');
        paintUnknownParameterItem(canvas, canvasSize);
    }
  }

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

  // "unknown" parameter -> simple block with text
  void paintUnknownParameterItem(
    final Canvas canvas,
    final double size,
  ) {
    final paint = Paint();
    paint.strokeJoin = StrokeJoin.round;
    paint.strokeWidth = 3;

    final textSpan = TextSpan(
      text: '$code\n$value',
      style: const TextStyle(
        color: Colors.black,
        fontSize: 18,
        fontWeight: FontWeight.bold,
      ),
    );
    final textPainter = TextPainter(
      text: textSpan,
      textDirection: TextDirection.ltr,
      textAlign: TextAlign.center,
    );
    textPainter.layout();
    textPainter.paint(
      canvas,
      Offset(
        (size - textPainter.width) * 0.5,
        (size - textPainter.height) * 0.5,
      ),
    );
  }

  void paintGameModeParameterItem(
    final Canvas canvas,
    final double size,
  ) {
    String text = '';

    switch (value) {
      case DefaultActivitySettings.gameModeValueOnline:
        text = '🌐';
        break;
      case DefaultActivitySettings.gameModeValueOffline:
        text = '📱';
        break;
      default:
        printlog('Wrong value for gameMode parameter value: $value');
    }

    final paint = Paint();
    paint.strokeJoin = StrokeJoin.round;
    paint.strokeWidth = 3 / 100 * size;

    // centered text value
    final textSpan = TextSpan(
      text: text,
      style: TextStyle(
        color: Colors.black,
        fontSize: size / 2,
        fontWeight: FontWeight.bold,
      ),
    );
    final textPainter = TextPainter(
      text: textSpan,
      textDirection: TextDirection.ltr,
      textAlign: TextAlign.center,
    );
    textPainter.layout();
    textPainter.paint(
      canvas,
      Offset(
        (size - textPainter.width) * 0.5,
        (size - textPainter.height) * 0.5,
      ),
    );
  }

  void paintGameLevelParameterItem(
    final Canvas canvas,
    final double size,
  ) {
    String text = '';

    switch (value) {
      case DefaultActivitySettings.gameLevelValueEasy:
        text = '🧒';
        break;
      case DefaultActivitySettings.gameLevelValueHard:
        text = '🧑‍🎓';
        break;
      default:
        printlog('Wrong value for gameLevel parameter value: $value');
    }

    final paint = Paint();
    paint.strokeJoin = StrokeJoin.round;
    paint.strokeWidth = 3 / 100 * size;

    // centered text value
    final textSpan = TextSpan(
      text: text,
      style: TextStyle(
        color: Colors.black,
        fontSize: size / 2,
        fontWeight: FontWeight.bold,
      ),
    );
    final textPainter = TextPainter(
      text: textSpan,
      textDirection: TextDirection.ltr,
      textAlign: TextAlign.center,
    );
    textPainter.layout();
    textPainter.paint(
      canvas,
      Offset(
        (size - textPainter.width) * 0.5,
        (size - textPainter.height) * 0.5,
      ),
    );
  }
}