import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter/cupertino.dart';
import 'package:intl/intl.dart';
import 'package:mohem_flutter_app/classes/colors.dart';

extension CapExtension on String {
  String get toCamelCase => "${this[0].toUpperCase()}${this.substring(1)}";

  String get inCaps => '${this[0].toUpperCase()}${this.substring(1)}';

  String get allInCaps => this.toUpperCase();

  String get capitalizeFirstofEach => this.trim().length > 0 ? this.trim().toLowerCase().split(" ").map((str) => str.inCaps).join(" ") : "";
}

extension EmailValidator on String {
  Widget get toWidget => Text(this);

  Widget toText10({Color? color, bool isBold = false, int? maxlines, FontStyle? fontStyle}) => Text(
        this,
        maxLines: maxlines,
        style: TextStyle(fontSize: 10, fontStyle: fontStyle ?? FontStyle.normal, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4),
      );

  Widget toText11({Color? color, FontWeight? weight, bool isUnderLine = false, bool isBold = false}) => Text(
        this,
        style: TextStyle(
          fontSize: 11,
          fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.w600),
          color: color ?? MyColors.darkTextColor,
          letterSpacing: -0.33,
          decoration: isUnderLine ? TextDecoration.underline : null,
        ),
      );

  Widget toText12({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0}) => Text(
        this,
        textAlign: isCenter ? TextAlign.center : null,
        maxLines: (maxLine > 0) ? maxLine : null,
        style: TextStyle(
          fontSize: 12,
          fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
          color: color ?? MyColors.darkTextColor,
          letterSpacing: -0.72,
          decoration: isUnderLine ? TextDecoration.underline : null,
        ),
      );

  Widget toText12Auto({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0}) => AutoSizeText(
        this,
        textAlign: isCenter ? TextAlign.center : null,
        maxLines: (maxLine > 0) ? maxLine : null,
        minFontSize: 8,
        style: TextStyle(
          fontSize: 12,
          fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
          color: color ?? MyColors.darkTextColor,
          letterSpacing: -0.72,
          decoration: isUnderLine ? TextDecoration.underline : null,
        ),
      );

  Widget toTextAuto({
    Color? color,
    bool isUnderLine = false,
    bool isBold = false,
    bool isCenter = false,
    int maxLine = 0,
    double fontSize = 12,
    double letterSpacing = -0.72,
    double height = 1,
  }) =>
      AutoSizeText(
        this,
        textAlign: isCenter ? TextAlign.center : null,
        maxLines: (maxLine > 0) ? maxLine : null,
        minFontSize: 5,
        style: TextStyle(
          fontSize: fontSize,
          fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
          color: color ?? MyColors.darkTextColor,
          letterSpacing: letterSpacing,
          decoration: isUnderLine ? TextDecoration.underline : null,
        ),
      );

  Widget toText13({Color? color, bool isUnderLine = false}) => Text(
        this,
        style: TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.52, decoration: isUnderLine ? TextDecoration.underline : null),
      );

  Widget toText14({Color? color, bool isUnderLine = false, bool isBold = false, FontWeight? weight, int? maxlines}) => Text(
        this,
        maxLines: maxlines,
        style: TextStyle(
            color: color ?? MyColors.darkTextColor,
            fontSize: 14,
            letterSpacing: -0.48,
            fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.w600),
            decoration: isUnderLine ? TextDecoration.underline : null),
      );

  Widget toText16({Color? color, bool isUnderLine = false, bool isBold = false, int? maxlines}) => Text(
        this,
        maxLines: maxlines,
        style: TextStyle(
          color: color ?? MyColors.darkTextColor,
          fontSize: 16,
          letterSpacing: -0.64,
          fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
          decoration: isUnderLine ? TextDecoration.underline : null,
        ),
      );

  Widget toText17({Color? color, bool isBold = false}) => Text(
        this,
        style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 17, letterSpacing: -0.68, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
      );

  Widget toText18({Color? color, bool isBold = false}) => Text(
        this,
        style: TextStyle(fontSize: 18, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -1.08),
      );

  Widget toText19({Color? color, bool isBold = false}) => Text(
        this,
        style: TextStyle(fontSize: 19, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -1.14),
      );

  Widget toText20({Color? color, bool isBold = false}) => Text(
        this,
        style: TextStyle(fontSize: 20, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4),
      );

  Widget toText21({Color? color, bool isBold = false, FontWeight? weight, int? maxlines}) => Text(
        this,
        maxLines: maxlines,
        style: TextStyle(color: color ?? MyColors.grey3AColor, fontSize: 21, letterSpacing: -0.31, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.w600)),
      );

  Widget toText22({Color? color, bool isBold = false}) => Text(
        this,
        style: TextStyle(height: 1, color: color ?? MyColors.darkTextColor, fontSize: 22, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
      );

  Widget toText24({Color? color, bool isBold = false}) => Text(
        this,
        style: TextStyle(height: 23 / 24, color: color ?? MyColors.darkTextColor, fontSize: 24, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
      );

  Widget toText32({Color? color, bool isBold = false}) => Text(
        this,
        style: TextStyle(height: 32 / 32, color: color ?? MyColors.darkTextColor, fontSize: 32, letterSpacing: -1.92, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
      );

  Widget toText44({Color? color, bool isBold = false}) => Text(
        this,
        style: TextStyle(height: 32 / 32, color: color ?? MyColors.darkTextColor, fontSize: 44, letterSpacing: -2.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
      );

  Widget toSectionHeading({String upperHeading = "", String lowerHeading = ""}) {
    String upper = "";
    String lower = "";
    String heading = this;
    if (heading.isNotEmpty) {
      List<String> data = heading.split(" ");

      if (data.length > 1) {
        upper = data[0];
        data.removeAt(0);
        lower = data.join(" ");
      } else {
        lower = data[0];
      }
    }
    if (upperHeading.isNotEmpty) {
      upper = upperHeading;
    }
    if (lowerHeading.isNotEmpty) {
      lower = lowerHeading;
    }

    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      mainAxisSize: MainAxisSize.min,
      children: [
        if (upper.isNotEmpty) upper.toText12(),
        lower.toText24(isBold: true),
      ],
    );
  }

  bool isValidEmail() {
    return RegExp(r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$').hasMatch(this);
  }

  String toFormattedDate() {
    String date = this.split("T")[0];
    String time = this.split("T")[1];
    var dates = date.split("-");
    return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}";
  }

  String getMonth(int month) {
    switch (month) {
      case 1:
        return "January";
      case 2:
        return "February";
      case 3:
        return "March";
      case 4:
        return "April";
      case 5:
        return "May";
      case 6:
        return "June";
      case 7:
        return "July";
      case 8:
        return "August";
      case 9:
        return "September";
      case 10:
        return "October";
      case 11:
        return "November";
      case 12:
        return "December";
      default:
        return "";
    }
  }
}
