import 'package:test/test.dart';
import '../lib/platform_conditionable.dart';

class TestClass with Conditionable {
  String value = '';

  TestClass append(String text) {
    value += text;
    return this;
  }
}

void main() {
  group('Conditionable', () {
    late TestClass instance;

    setUp(() {
      instance = TestClass();
    });

    group('when', () {
      test('executes callback when condition is true', () {
        instance.when(true, (self, value) {
          (self as TestClass).append('true');
        });

        expect(instance.value, equals('true'));
      });

      test('skips callback when condition is false', () {
        instance.when(false, (self, value) {
          (self as TestClass).append('false');
        });

        expect(instance.value, isEmpty);
      });

      test('executes orElse when condition is false', () {
        instance.when(
          false,
          (self, value) {
            (self as TestClass).append('false');
          },
          orElse: (self, value) {
            (self as TestClass).append('else');
          },
        );

        expect(instance.value, equals('else'));
      });

      test('evaluates closure conditions', () {
        instance.when(() => true, (self, value) {
          (self as TestClass).append('closure');
        });

        expect(instance.value, equals('closure'));
      });

      test('supports method chaining', () {
        instance.when(true, (self, value) {
          (self as TestClass).append('first');
          return self;
        }).when(true, (self, value) {
          (self as TestClass).append('-second');
          return self;
        });

        expect(instance.value, equals('first-second'));
      });
    });

    group('unless', () {
      test('executes callback when condition is false', () {
        instance.unless(false, (self, value) {
          (self as TestClass).append('false');
        });

        expect(instance.value, equals('false'));
      });

      test('skips callback when condition is true', () {
        instance.unless(true, (self, value) {
          (self as TestClass).append('true');
        });

        expect(instance.value, isEmpty);
      });

      test('executes orElse when condition is true', () {
        instance.unless(
          true,
          (self, value) {
            (self as TestClass).append('true');
          },
          orElse: (self, value) {
            (self as TestClass).append('else');
          },
        );

        expect(instance.value, equals('else'));
      });

      test('evaluates closure conditions', () {
        instance.unless(() => false, (self, value) {
          (self as TestClass).append('closure');
        });

        expect(instance.value, equals('closure'));
      });
    });

    group('whenThen', () {
      test('executes callback in method cascade when condition is true', () {
        instance
          ..whenThen(true, () {
            instance.append('cascade');
          })
          ..append('-end');

        expect(instance.value, equals('cascade-end'));
      });

      test('executes orElse in method cascade when condition is false', () {
        instance
          ..whenThen(
            false,
            () {
              instance.append('false');
            },
            orElse: () {
              instance.append('else');
            },
          )
          ..append('-end');

        expect(instance.value, equals('else-end'));
      });
    });

    group('unlessThen', () {
      test('executes callback in method cascade when condition is false', () {
        instance
          ..unlessThen(false, () {
            instance.append('cascade');
          })
          ..append('-end');

        expect(instance.value, equals('cascade-end'));
      });

      test('executes orElse in method cascade when condition is true', () {
        instance
          ..unlessThen(
            true,
            () {
              instance.append('true');
            },
            orElse: () {
              instance.append('else');
            },
          )
          ..append('-end');

        expect(instance.value, equals('else-end'));
      });
    });

    test('complex chaining with mixed conditions', () {
      instance
        ..when(true, (self, value) {
          (self as TestClass).append('1');
          return self;
        })
        ..unless(false, (self, value) {
          (self as TestClass).append('-2');
          return self;
        })
        ..whenThen(true, () {
          instance.append('-3');
        })
        ..unlessThen(false, () {
          instance.append('-4');
        });

      expect(instance.value, equals('1-2-3-4'));
    });
  });
}