import 'package:flutter/material.dart';
import 'package:solitaire_game/provider/data.dart';
import 'package:solitaire_game/utils/game_utils.dart';

class Tile {
  int currentRow;
  int currentCol;
  bool hasPeg;

  Tile(
    this.currentRow,
    this.currentCol,
    this.hasPeg,
  );

  Widget render(Data myProvider) {
    List<Widget> stack = [
      hole(myProvider),
    ];

    if (hasPeg) {
      stack.add(draggable(myProvider));
    }

    return Stack(
      alignment: Alignment.center,
      children: stack,
    );
  }

  Widget hole(Data myProvider) {
    String image = 'assets/skins/${myProvider.parameterSkin}_hole.png';

    return DragTarget<List<int>>(
      builder: (
        BuildContext context,
        List<dynamic> accepted,
        List<dynamic> rejected,
      ) {
        return Image(
          image: AssetImage(image),
          width: myProvider.tileSize,
          height: myProvider.tileSize,
          fit: BoxFit.fill,
        );
      },
      onAcceptWithDetails: (DragTargetDetails<List<int>> source) {
        List<int> target = [currentCol, currentRow];
        // printlog('(drag) Pick from ' + source.toString() + ' and drop on ' + target.toString());
        if (GameUtils.isMoveAllowed(myProvider, source.data, target)) {
          GameUtils.move(myProvider, source.data, target);
        }
      },
    );
  }

  Widget draggable(Data myProvider) {
    return Draggable<List<int>>(
      data: [currentCol, currentRow],

      // Widget when draggable is being dragged
      feedback: peg(myProvider),

      // Widget to display on original place when being dragged
      childWhenDragging: Container(),

      // Widget when draggable is stationary
      child: peg(myProvider),
    );
  }

  Widget peg(Data myProvider) {
    String image = 'assets/skins/${myProvider.parameterSkin}_peg.png';

    return Image(
      image: AssetImage(image),
      width: myProvider.tileSize,
      height: myProvider.tileSize,
      fit: BoxFit.fill,
    );
  }
}