import 'package:flutter/material.dart';

import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

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

  final ApplicationConfigDefinition appConfig;
  final bool canBeResumed;

  final double separatorHeight = 4.0;

  @override
  Widget build(BuildContext context) {
    // Activity settings (top)
    final List<Widget> blockTop = [];
    for (ApplicationSettingsParameter parameter in appConfig.activitySettings) {
      if (parameter.displayedOnTop) {
        for (List<Widget> itemsLine in buildParametersLines(
          parameter: parameter,
          isEnabled: !canBeResumed,
        )) {
          blockTop.add(Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: itemsLine,
          ));
        }
        blockTop.add(SizedBox(height: separatorHeight));
      }
    }

    // Activity settings (bottom)
    final List<Widget> blockBottom = [];
    for (ApplicationSettingsParameter parameter in appConfig.activitySettings) {
      if (!parameter.displayedOnTop) {
        for (List<Widget> itemsLine in buildParametersLines(
          parameter: parameter,
          isEnabled: !canBeResumed,
        )) {
          blockBottom.add(Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: itemsLine,
          ));
        }
        blockBottom.add(SizedBox(height: separatorHeight));
      }
    }

    // Actions buttons (middle block)
    final double buttonBaseSize = MediaQuery.of(context).size.width / 4;
    final List<Widget> blockActions = [];
    if (canBeResumed) {
      blockActions.add(Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          // Delete saved activity
          SizedBox.fromSize(
            size: Size(buttonBaseSize, buttonBaseSize),
            child: ActivityButtonDeleteSaved(
              onPressed: () {
                appConfig.deleteCurrentActivity(context);
              },
            ),
          ),
          // Resume activity
          SizedBox.fromSize(
            size: Size(2.9 * buttonBaseSize, buttonBaseSize),
            child: ActivityButtonResumeSaved(
              onPressed: () {
                appConfig.resumeActivity(context);
              },
            ),
          ),
        ],
      ));
    } else {
      // Start new activity
      blockActions.add(
        SizedBox.fromSize(
          size: Size(4 * buttonBaseSize, buttonBaseSize),
          child: ActivityButtonStartNew(
            onPressed: () {
              appConfig.startNewActivity(context);
            },
          ),
        ),
      );
    }
    blockActions.add(SizedBox(height: separatorHeight));

    // Global blocks list
    final List<Widget> blocks = [
      Expanded(
        child: appConfig.allowScrollParametersList
            ? ListView(
                children: blockTop,
              )
            : Column(
                children: blockTop,
              ),
      ),
      SizedBox(height: separatorHeight),
    ];

    blocks.addAll(blockActions);

    if (blockBottom.isNotEmpty) {
      blocks.addAll(blockBottom);
    } else {
      // Add bottom margin
      blocks.add(SizedBox(height: separatorHeight));
      blocks.add(SizedBox(height: separatorHeight));
    }

    return Column(children: blocks);
  }

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

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

    final int itemsPerLine =
        parameter.itemsPerLine != 0 ? parameter.itemsPerLine : items.length;

    // Build linear list
    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 / itemsPerLine - 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);
    }

    // Split buttons in lines according to items count limit per line
    final List<List<Widget>> lines = [];

    List<Widget> line = [];
    for (var parameterButton in parameterButtons) {
      line.add(parameterButton);
      if (line.length == itemsPerLine) {
        lines.add(line);
        line = [];
      }
    }
    if (line.length != itemsPerLine) {
      lines.add(line);
    }

    return lines;
  }
}