// ignore_for_file: constant_identifier_names

import 'package:base_project/core/app_export.dart';
import 'package:flutter/material.dart';
import '../utils/color_constants.dart';
import '../utils/size_utils.dart';

extension IconButtonStyleHelper on CustomIconButton {
  static BoxDecoration get fillErrorContainer => BoxDecoration(
        color: theme.colorScheme.errorContainer,
      );

  static BoxDecoration get fillDeepOrangeA => BoxDecoration(
        color: appTheme.deepOrangeA400,
        borderRadius: BorderRadius.circular(26.h),
      );
  static BoxDecoration get fillLightBlue => BoxDecoration(
        color: appTheme.lightBlue900,
        borderRadius: BorderRadius.circular(4.h),
      );
  static BoxDecoration get fillBlue => BoxDecoration(
        color: appTheme.blue400,
        borderRadius: BorderRadius.circular(25.h),
      );
  static BoxDecoration get outlineIndigoTL12 => BoxDecoration(
        color: appTheme.lightGreenA200,
        borderRadius: BorderRadius.circular(12.h),
        border: Border.all(
          color: appTheme.indigo50,
          width: 1.h,
        ),
      );

  static BoxDecoration get fillPrimaryContainer => BoxDecoration(
        color: theme.colorScheme.primaryContainer,
      );
  static BoxDecoration get fillPrimary => BoxDecoration(
        color: theme.colorScheme.primary,
        borderRadius: BorderRadius.circular(16.h),
      );
  static BoxDecoration get outlineIndigo => BoxDecoration(
        color: appTheme.lightGreenA200,
        borderRadius: BorderRadius.circular(12.h),
        border: Border.all(
          color: appTheme.indigo50,
          width: 1.h,
        ),
      );

  static BoxDecoration get fillBlueA => BoxDecoration(
        color: appTheme.blueA20002,
      );

  static BoxDecoration get gradientLightGreenAToLightGreenA => BoxDecoration(
        borderRadius: BorderRadius.circular(32.h),
        gradient: LinearGradient(
          begin: const Alignment(0.5, 0),
          end: const Alignment(0.5, 1),
          colors: [appTheme.lightGreenA20001, appTheme.lightGreenA20000],
        ),
      );
}

class CustomIconButton extends StatelessWidget {
  final EdgeInsetsGeometry? padding;

  CustomIconButton({super.key, 
    this.shape,
    this.padding,
    this.variant,
    this.alignment,
    this.margin,
    this.width,
    this.height,
    this.child,
    this.onTap,
    this.decoration,
    this.padding_f,
  });

  // file===green color for all boottom bar
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onTap,
      child: Container(
        height: height,
        width: width,
        padding: padding ?? EdgeInsets.zero,
        decoration: decoration ??
            BoxDecoration(
              color: const Color.fromRGBO(253, 202, 101, 1.0),
              borderRadius: BorderRadius.circular(
                // Set borderRadius to half of the smallest dimension
                width! < height! ? width! / 2 : height! / 2,
              ), // Adjust as needed
            ),
        child: Center(child: child), // Ensure child is centered
      ),
    );
  }

  // @override
  // Widget build(BuildContext context) {
  //   return GestureDetector(
  //     onTap: onTap,
  //     child: Container(
  //       height: height,
  //       width: width,
  //       padding: padding ?? EdgeInsets.zero,
  //       decoration: decoration ??
  //           BoxDecoration(
  //             color: Colors.blue,
  //             borderRadius: BorderRadius.circular(16), // Adjust as needed
  //           ),
  //       child: Center(child: child), // Ensure child is centered
  //     ),
  //   );
  // }

  IconButtonShape? shape;

  // IconButtonPadding? padding;

  IconButtonVariant? variant;

  Alignment? alignment;

  EdgeInsetsGeometry? margin;

  double? width;

  double? height;

  Widget? child;

  VoidCallback? onTap;

  final BoxDecoration? decoration;
  final EdgeInsetsGeometry? padding_f;

  // @override
  // Widget build(BuildContext context) {
  //   return alignment != null
  //       ? Align(
  //           alignment: alignment ?? Alignment.center,
  //           child: _buildIconButtonWidget(),
  //         )
  //       : _buildIconButtonWidget();
  // }

  Widget get iconButtonWidget => SizedBox(
        height: height ?? 0,
        width: width ?? 0,
        child: IconButton(
          padding: EdgeInsets.zero,
          icon: Container(
            height: height ?? 0,
            width: width ?? 0,
            padding: padding_f ?? EdgeInsets.zero,
            decoration: decoration ??
                BoxDecoration(
                  color: appTheme.lightGreenA200,
                  borderRadius: BorderRadius.circular(25.h),
                ),
            child: child,
          ),
          onPressed: onTap,
        ),
      );

  _buildIconButtonWidget() {
    return Padding(
      padding: margin ?? EdgeInsets.zero,
      child: IconButton(
        visualDensity: const VisualDensity(
          vertical: -4,
          horizontal: -4,
        ),
        iconSize: getSize(height ?? 0),
        padding: const EdgeInsets.all(0),
        icon: Container(
          alignment: Alignment.center,
          width: getSize(width ?? 0),
          height: getSize(height ?? 0),
          padding: _setPadding(),
          decoration: _buildDecoration(),
          child: child,
        ),
        onPressed: onTap,
      ),
    );
  }

  _buildDecoration() {
    return BoxDecoration(
      color: _setColor(),
      border: _setBorder(),
      borderRadius: _setBorderRadius(),
      boxShadow: _setBoxShadow(),
    );
  }

  EdgeInsets _setPadding() {
    if (padding == IconButtonPadding.PaddingAll4) {
      return const EdgeInsets.all(4);
    } else if (padding == IconButtonPadding.PaddingAll16) {
      return const EdgeInsets.all(16);
    } else if (padding == IconButtonPadding.PaddingAll8) {
      return const EdgeInsets.all(8);
    } else {
      return const EdgeInsets.all(11);
    }
  }

  // _setPadding() {
  //   switch (padding) {
  //     case IconButtonPadding.PaddingAll4:
  //       return getPadding(
  //         all: 4,
  //       );
  //     case IconButtonPadding.PaddingAll16:
  //       return getPadding(
  //         all: 16,
  //       );
  //     case IconButtonPadding.PaddingAll8:
  //       return getPadding(
  //         all: 8,
  //       );
  //     default:
  //       return getPadding(
  //         all: 11,
  //       );
  //   }
  // }

  _setColor() {
    switch (variant) {
      case IconButtonVariant.FillBlueA700:
        return ColorConstant.blueA700;
      case IconButtonVariant.OutlineGray80049:
        return ColorConstant.whiteA700;
      case IconButtonVariant.FillGray300:
        return ColorConstant.gray300;
      case IconButtonVariant.FillGray100:
        return ColorConstant.gray100;
      case IconButtonVariant.FillBlack90001:
        return ColorConstant.black90001;
      case IconButtonVariant.OutlineBluegray400:
        return ColorConstant.whiteA700;
      case IconButtonVariant.FillBlueA200:
        return ColorConstant.blueA200;
      case IconButtonVariant.OutlineBlueA700:
      case IconButtonVariant.OutlineBlue50:
        return null;
      default:
        return ColorConstant.blue50;
    }
  }

  _setBorder() {
    switch (variant) {
      case IconButtonVariant.OutlineBlueA700:
        return Border.all(
          color: ColorConstant.blueA700,
          width: getHorizontalSize(
            1.00,
          ),
        );
      case IconButtonVariant.OutlineGray80049:
        return Border.all(
          color: ColorConstant.gray80049,
          width: getHorizontalSize(
            1.00,
          ),
        );
      case IconButtonVariant.OutlineBlue50:
        return Border.all(
          color: ColorConstant.blue50,
          width: getHorizontalSize(
            1.00,
          ),
        );
      case IconButtonVariant.OutlineBluegray400:
        return Border.all(
          color: ColorConstant.blueGray400,
          width: getHorizontalSize(
            1.00,
          ),
        );
      case IconButtonVariant.FillBlue50:
      case IconButtonVariant.FillBlueA700:
      case IconButtonVariant.FillGray300:
      case IconButtonVariant.FillGray100:
      case IconButtonVariant.FillBlack90001:
      case IconButtonVariant.FillBlueA200:
        return null;
      default:
        return null;
    }
  }

  _setBorderRadius() {
    switch (shape) {
      case IconButtonShape.CircleBorder15:
        return BorderRadius.circular(
          getHorizontalSize(
            15.00,
          ),
        );
      case IconButtonShape.RoundedBorder26:
        return BorderRadius.circular(
          getHorizontalSize(
            26.00,
          ),
        );
      case IconButtonShape.CircleBorder10:
        return BorderRadius.circular(
          getHorizontalSize(
            10.00,
          ),
        );
      case IconButtonShape.CircleBorder30:
        return BorderRadius.circular(
          getHorizontalSize(
            30.00,
          ),
        );
      default:
        return BorderRadius.circular(
          getHorizontalSize(
            6.00,
          ),
        );
    }
  }

  _setBoxShadow() {
    switch (variant) {
      case IconButtonVariant.OutlineBlueA700:
        return [
          BoxShadow(
            color: ColorConstant.indigoA20033,
            spreadRadius: getHorizontalSize(
              2.00,
            ),
            blurRadius: getHorizontalSize(
              2.00,
            ),
            offset: const Offset(
              0,
              4,
            ),
          ),
        ];
      case IconButtonVariant.FillBlue50:
      case IconButtonVariant.FillBlueA700:
      case IconButtonVariant.OutlineGray80049:
      case IconButtonVariant.FillGray300:
      case IconButtonVariant.FillGray100:
      case IconButtonVariant.FillBlack90001:
      case IconButtonVariant.OutlineBlue50:
      case IconButtonVariant.OutlineBluegray400:
      case IconButtonVariant.FillBlueA200:
        return null;
      default:
        return null;
    }
  }
}

enum IconButtonShape {
  RoundedBorder6,
  CircleBorder15,
  RoundedBorder26,
  CircleBorder10,
  CircleBorder30,
}

enum IconButtonPadding {
  PaddingAll4,
  PaddingAll16,
  PaddingAll8,
  PaddingAll11,
}

enum IconButtonVariant {
  FillBlue50,
  FillBlueA700,
  OutlineBlueA700,
  OutlineGray80049,
  FillGray300,
  FillGray100,
  FillBlack90001,
  OutlineBlue50,
  OutlineBluegray400,
  FillBlueA200,
}
