import 'dart:math';

import 'package:drift/drift.dart';
import 'package:sendtrain/database/database.dart';

Future<void> seedDb(AppDatabase database) async {
  // seed data setup
  final List<List> sessionValues = [
    [
      'Projecting @ Climbers Rock',
      'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.'
    ],
    [
      'Moonboard @ Boardroom',
      'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.'
    ],
    [
      'Off-Wall Training',
      'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.'
    ],
    [
      'Climbing Outdoors',
      'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.'
    ],
    [
      'Volume Session @ Gravity',
      'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.'
    ],
  ];

  final List<List> mediaItems = [
    [
      'https://www.climbing.com/wp-content/uploads/2022/06/campus-board-e1655470701154.jpeg',
      MediaType.image
    ],
    ['BgheYcxhrsw', MediaType.youtube]
  ];

  final int totalSessions = 15;
  final int totalActivities = 6;
  final int totalActions = 5;
  final int totalMedia = 5;
  final random = Random();

  // seed loop
  for (int i = 0; i < totalSessions; i++) {
    // session things
    var status = SessionStatus.completed;
    if (i == 0) status = SessionStatus.started;
    if (i == 1) status = SessionStatus.pending;

    final sessionValue = sessionValues[random.nextInt(sessionValues.length)];
    await database
        .into(database.sessions)
        .insert(SessionsCompanion.insert(
            title: sessionValue[0],
            content: sessionValue[1],
            status: status,
            date: Value(DateTime.now())))
        .then((sessionId) async {
      // activities things
      for (int j = 0; j < random.nextInt(totalActivities); j++) {
        await database
            .into(database.activities)
            .insert(ActivitiesCompanion.insert(
                title: "test activity $j",
                type: ActivityType
                    .values[random.nextInt(ActivityType.values.length)],
                description: "test training activity $j",
                category: ActivityCategories
                    .values[random.nextInt(ActivityCategories.values.length)]))
            .then((activityId) async {
          // session activity relationships
          await database
              .into(database.sessionActivities)
              .insert(SessionActivitiesCompanion.insert(
                sessionId: sessionId,
                activityId: activityId,
                results: Value("results json, will need to test"),
                achievements: Value("comma, seperated, items"),
              ));

          // actions
          for (int k = 0; k < random.nextInt(totalActions); k++) {
            await database
                .into(database.actions)
                .insert(ActionsCompanion.insert(
                    title: 'test action $k',
                    description: 'test action description $k',
                    set: ''))
                .then((actionId) async {
              // add activity action association
              await database.into(database.activityActions).insert(
                  ActivityActionsCompanion.insert(
                      activityId: activityId, actionId: actionId));

              for (int l = 0; l < random.nextInt(totalMedia); l++) {
                final mediaItem = mediaItems[random.nextInt(mediaItems.length)];
                await database
                    .into(database.mediaItems)
                    .insert(MediaItemsCompanion.insert(
                        title: 'media title $l',
                        description: 'media description $l',
                        reference: mediaItem[0],
                        type: mediaItem[1]))
                    .then((mediaId) async {
                  await database.into(database.objectMediaItems).insert(
                      ObjectMediaItemsCompanion.insert(
                          objectId: actionId,
                          mediaId: mediaId,
                          objectType: ObjectType.actions));
                });
              }
            });
          }

          for (int l = 0; l < random.nextInt(totalMedia); l++) {
            final mediaItem = mediaItems[random.nextInt(mediaItems.length)];
            await database
                .into(database.mediaItems)
                .insert(MediaItemsCompanion.insert(
                    title: 'media title $l',
                    description: 'media description $l',
                    reference: mediaItem[0],
                    type: mediaItem[1]))
                .then((mediaId) async {
              await database.into(database.objectMediaItems).insert(
                  ObjectMediaItemsCompanion.insert(
                      objectId: activityId,
                      mediaId: mediaId,
                      objectType: ObjectType.activities));
            });
          }
        });
      }

      for (int l = 0; l < random.nextInt(totalMedia); l++) {
        final mediaItem = mediaItems[random.nextInt(mediaItems.length)];
        await database
            .into(database.mediaItems)
            .insert(MediaItemsCompanion.insert(
                title: 'media title $l',
                description: 'media description $l',
                reference: mediaItem[0],
                type: mediaItem[1]))
            .then((mediaId) async {
          await database.into(database.objectMediaItems).insert(
              ObjectMediaItemsCompanion.insert(
                  objectId: sessionId,
                  mediaId: mediaId,
                  objectType: ObjectType.sessions));
        });
      }
    });
  }
}