import 'package:pub_semver/pub_semver.dart';

enum VersionNumber {
  MAJOR,
  MINOR,
  PATCH,
}

class VersionTool {
  Version version;
  VersionTool(this.version);
  VersionTool.fromText(String text) : version = Version.parse(text);

  Version get nextMajor => _addBuildNumber(VersionNumber.MAJOR);
  Version get nextMinor => _addBuildNumber(VersionNumber.MINOR);
  Version get nextPatch => _addBuildNumber(VersionNumber.PATCH);

  Version nextMajorTag(String tag) => _addBuildNumber(
        VersionNumber.MAJOR,
        tag: tag,
      );
  Version nextMinorTag(String tag) => _addBuildNumber(
        VersionNumber.MINOR,
        tag: tag,
      );
  Version nextPatchTag(String tag) => _addBuildNumber(
        VersionNumber.PATCH,
        tag: tag,
      );

  Version _addBuildNumber(VersionNumber type, {String? tag}) {
    switch (type) {
      case VersionNumber.MAJOR:
        return Version(
          version.major,
          version.minor,
          version.patch + 1,
          pre: tag,
          build: '${(version.build.first as int) + 1}',
        );
      case VersionNumber.MINOR:
        return Version(
          version.major,
          version.minor + 1,
          0,
          pre: tag,
          build: '${(version.build.first as int) + 1}',
        );
      case VersionNumber.PATCH:
        return Version(
          version.major + 1,
          0,
          0,
          pre: tag,
          build: '${(version.build.first as int) + 1}',
        );
    }
  }
}