// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';

void main() {
  // Changes made in https://github.com/flutter/flutter/pull/142151
  WidgetState selected = WidgetState.selected;
  WidgetState hovered = WidgetState.hovered;
  WidgetState focused = WidgetState.focused;
  WidgetState pressed = WidgetState.pressed;
  WidgetState dragged = WidgetState.dragged;
  WidgetState scrolledUnder = WidgetState.scrolledUnder;
  WidgetState disabled = WidgetState.disabled;
  WidgetState error = WidgetState.error;

  final WidgetPropertyResolver<MouseCursor?> resolveCallback;

  Color getColor(Set<WidgetState> states) {
    if (states.contains(WidgetState.disabled)) {
      if (states.contains(WidgetState.selected)) {
        return Color(0xFF000002);
      }
      return Color(0xFF000004);
    }
    if (states.contains(WidgetState.selected)) {
      return Color(0xFF000001);
    }
    return Color(0xFF000003);
  }

  final WidgetStateProperty<Color> backgroundColor = WidgetStateColor.resolveWith(getColor);

  class _MouseCursor extends WidgetStateMouseCursor {
    const _MouseCursor(this.resolveCallback);

    final WidgetPropertyResolver<MouseCursor?> resolveCallback;

    @override
    MouseCursor resolve(Set<WidgetState> states) => resolveCallback(states) ?? MouseCursor.uncontrolled;
  }

  WidgetStateBorderSide? get side {
    return WidgetStateBorderSide.resolveWith((Set<WidgetState> states) {
      if (states.contains(WidgetState.disabled)) {
        if (states.contains(WidgetState.selected)) {
          return const BorderSide(width: 2.0);
        }
        return BorderSide(width: 1.0);
      }
      if (states.contains(WidgetState.selected)) {
        return const BorderSide(width: 1.5);
      }
      return BorderSide(width: 0.5);
    });
  }

  class SelectedBorder extends RoundedRectangleBorder implements WidgetStateOutlinedBorder {
    const SelectedBorder();

    @override
    OutlinedBorder? resolve(Set<WidgetState> states) {
      if (states.contains(WidgetState.selected)) {
        return const RoundedRectangleBorder();
      }
      return null;
    }
  }

  TextStyle floatingLabelStyle = WidgetStateTextStyle.resolveWith(
    (Set<WidgetState> states) {
      final Color color =
          states.contains(WidgetState.error) ? Theme.of(context).colorScheme.error : Colors.orange;
      return TextStyle(color: color, letterSpacing: 1.3);
    },
  );

  final WidgetStateProperty<Icon?> thumbIcon =
      WidgetStateProperty.resolveWith<Icon?>((Set<WidgetState> states) {
    if (states.contains(WidgetState.selected)) {
      return const Icon(Icons.check);
    }
    return const Icon(Icons.close);
  });

  final Color backgroundColor = WidgetStatePropertyAll<Color>(
    Colors.blue.withOpacity(0.12),
  );

  final WidgetStatesController statesController =
    WidgetStatesController(<WidgetState>{if (widget.selected) WidgetState.selected});

  class _MyWidget extends StatefulWidget {
    const _MyWidget({
      required this.controller,
      required this.evaluator,
      required this.materialState,
    });

    final bool Function(_MyWidgetState state) evaluator;

    /// Stream passed down to the child [_InnerWidget] to begin the process.
    /// This plays the role of an actual user interaction in the wild, but allows
    /// us to engage the system without mocking pointers/hovers etc.
    final StreamController<bool> controller;

    /// The value we're watching in the given test.
    final WidgetState materialState;

    @override
    State createState() => _MyWidgetState();
  }

}