import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:stopmotion/models/data/picture.dart';
import 'package:stopmotion/models/settings/settings_activity.dart';
import 'package:stopmotion/models/settings/settings_global.dart';

class Activity {
  Activity({
    // Settings
    required this.activitySettings,
    required this.globalSettings,

    // State
    this.isRunning = false,
    this.isStarted = false,
    this.isFinished = false,
    this.animationInProgress = false,

    // Base data
    this.pictures = const [],

    // Activity data
    this.position = 1,
  });

  // Settings
  final ActivitySettings activitySettings;
  final GlobalSettings globalSettings;

  // State
  bool isRunning;
  bool isStarted;
  bool isFinished;
  bool animationInProgress;

  // Base data
  List<Picture> pictures;

  // Activity data
  int position;

  factory Activity.createNull() {
    return Activity(
      // Settings
      activitySettings: ActivitySettings.createDefault(),
      globalSettings: GlobalSettings.createDefault(),
      // Base data
      pictures: [],
    );
  }

  factory Activity.createNew({
    ActivitySettings? activitySettings,
    GlobalSettings? globalSettings,
  }) {
    final ActivitySettings newActivitySettings =
        activitySettings ?? ActivitySettings.createDefault();
    final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();

    return Activity(
      // Settings
      activitySettings: newActivitySettings,
      globalSettings: newGlobalSettings,
      // State
      isRunning: true,
      // Base data
      pictures: [],
    );
  }

  bool get canBeResumed => isStarted && !isFinished;

  void dump() {
    printlog('');
    printlog('## Current activity dump:');
    printlog('');
    printlog('$Activity:');
    printlog('  Settings');
    activitySettings.dump();
    globalSettings.dump();
    printlog('  State');
    printlog('    isRunning: $isRunning');
    printlog('    isStarted: $isStarted');
    printlog('    isFinished: $isFinished');
    printlog('    animationInProgress: $animationInProgress');
    printlog('  Base data');
    printlog('    pictures: $pictures');
    printlog('  Activity data');
    printlog('    position: $position');
    printlog('');
  }

  @override
  String toString() {
    return '$Activity(${toJson()})';
  }

  Map<String, dynamic>? toJson() {
    return <String, dynamic>{
      // Settings
      'activitySettings': activitySettings.toJson(),
      'globalSettings': globalSettings.toJson(),
      // State
      'isRunning': isRunning,
      'isStarted': isStarted,
      'isFinished': isFinished,
      'animationInProgress': animationInProgress,
      // Base data
      'pictures': pictures,
      // Activity data
      'position': position,
    };
  }
}