import 'package:flutter/material.dart';

import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

class PageParameters extends StatelessWidget {
  const PageParameters({
    super.key,
    required this.config,
    required this.canBeResumed,
  });

  final ApplicationConfigDefinition config;
  final bool canBeResumed;

  final double separatorHeight = 8.0;

  @override
  Widget build(BuildContext context) {
    final List<Widget> lines = [];

    // Activity settings (top)
    for (ApplicationSettingsParameter parameter in config.activitySettings) {
      if (parameter.displayedOnTop) {
        lines.add(Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: buildParametersLine(
            parameter: parameter,
            isEnabled: !canBeResumed,
          ),
        ));

        lines.add(SizedBox(height: separatorHeight));
      }
    }

    lines.add(Expanded(
      child: SizedBox(height: separatorHeight),
    ));

    if (canBeResumed) {
      // Resume activity
      lines.add(AspectRatio(
        aspectRatio: 3,
        child: ActivityButtonResumeSaved(
          onPressed: () {
            config.resumeActivity(context);
          },
        ),
      ));
      // Delete saved activity
      lines.add(SizedBox.square(
        dimension: MediaQuery.of(context).size.width / 5,
        child: ActivityButtonDeleteSaved(
          onPressed: () {
            config.deleteCurrentActivity(context);
          },
        ),
      ));
    } else {
      // Start new activity
      lines.add(
        AspectRatio(
          aspectRatio: 3,
          child: ActivityButtonStartNew(
            onPressed: () {
              config.startNewActivity(context);
            },
          ),
        ),
      );
    }

    lines.add(SizedBox(height: separatorHeight));

    // Activity settings (bottom)
    for (ApplicationSettingsParameter parameter in config.activitySettings) {
      if (!parameter.displayedOnTop) {
        lines.add(Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: buildParametersLine(
            parameter: parameter,
            isEnabled: !canBeResumed,
          ),
        ));

        lines.add(SizedBox(height: separatorHeight));
      }
    }

    return Column(
      children: lines,
    );
  }

  List<Widget> buildParametersLine({
    required ApplicationSettingsParameter parameter,
    required bool isEnabled,
  }) {
    final List<ApplicationSettingsParameterItemValue> items = parameter.values;
    final List<Widget> parameterButtons = [];

    if (items.length <= 1) {
      return [];
    }

    for (ApplicationSettingsParameterItemValue item in items) {
      final Widget parameterButton = BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>(
        builder: (BuildContext context, ActivitySettingsState activitySettingsState) {
          final ActivitySettingsCubit activitySettingsCubit =
              BlocProvider.of<ActivitySettingsCubit>(context);

          final double displayWidth = MediaQuery.of(context).size.width;
          final double itemWidth = displayWidth / items.length - 4;

          return SizedBox.square(
            dimension: itemWidth,
            child: parameter.buildParameterItem(
              context: context,
              parameter: parameter,
              itemValue: item,
              size: itemWidth,
              onPressed: isEnabled
                  ? () {
                      activitySettingsCubit.set(parameter.code, item.value);
                    }
                  : null,
            ),
          );
        },
      );

      parameterButtons.add(parameterButton);
    }

    return parameterButtons;
  }
}