import 'dart:convert';

import 'package:workouttest_util/model/exercise.dart';
import 'package:workouttest_util/model/exercise_type.dart';
import 'package:workouttest_util/util/logging.dart';

enum ExercisePlanDetailState { start, inProgress, skipped, finished, extra }

extension ExericisePlanDetailStateExt on ExercisePlanDetailState {
  bool equalsTo(ExercisePlanDetailState state) => toString() == state.toString();
  bool equalsStringTo(String state) => toString() == state;
  String toStr() => toString().split(".").last;
}

class ExercisePlanDetail with Logging {
  int? exercisePlanDetailId;
  int? exercisePlanId;
  late int exerciseTypeId;
  int? serie;
  int? repeats;
  String? weightEquation;

  /// List<Exercise>
  List<Exercise>? exercises;

  /// bool finished
  bool? finished;
  ExercisePlanDetailState state = ExercisePlanDetailState.start;

  ExerciseType? exerciseType;

  String? change; // 1: update -1:delete 0: new

  ExercisePlanDetail(int exerciseTypeId) {
    exerciseTypeId = exerciseTypeId;
  }

  ExercisePlanDetail.fromJson(Map json) {
    exercisePlanDetailId = json['exercisePlanDetailId'];
    exercisePlanId = json['exercisePlanId'];
    exerciseTypeId = json['exerciseTypeId'];
    serie = json['serie'];
    repeats = json['repeats'];
    weightEquation = json['weightEquation'];
  }

  ExercisePlanDetail.fromJsonWithExerciseList(Map json) {
    exercisePlanDetailId = json['exercisePlanDetailId'];
    exercisePlanId = json['exercisePlanId'];
    exerciseTypeId = json['exerciseTypeId'];
    serie = json['serie'];
    repeats = json['repeats'];
    weightEquation = json['weightEquation'];
    try {
      final String exercises = json['exercises'];
      String jsonExercises = exercises.replaceAllMapped(
          RegExp(r'([a-zA-Z]+|[0-9]{4}\-[0-9]{2}\-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2})'), (Match m) => "\"${m[0]}\"");

      jsonExercises = jsonExercises.replaceAll(r'\"null\"', 'null');

      //print("Exercises $jsonExercises");
      Iterable iterable = jsonDecode(jsonExercises);
      this.exercises = iterable.map((exercise) => Exercise.fromJson(exercise)).toList();
    } on Exception catch (e) {
      log("JsonDecode error $e");
    }
  }

  Map<String, dynamic> toJson() => {
        "exercisePlanId": exercisePlanId ?? 0,
        "exerciseTypeId": exerciseTypeId,
        "serie": serie,
        "repeats": repeats,
        "weightEquation": weightEquation
      };

  Map<String, dynamic> toJsonWithExerciseList() => {
        "exercisePlanDetailId": exercisePlanDetailId,
        "exercisePlanId": exercisePlanId,
        "exerciseTypeId": exerciseTypeId,
        "serie": serie,
        "repeats": repeats,
        "weightEquation": weightEquation,
        'exercises': exercises == null ? [].toString() : exercises!.map((exercise) => exercise.toJson()).toList().toString(),
      };

  @override
  String toString() {
    Map<String, dynamic> json = toJsonWithExerciseList();
    return json.toString();
  }
}