import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:uuvpn/resources/app_colors.dart';
import 'package:uuvpn/resources/app_typography.dart';

ThemeData getApplicationTheme() {
  return ThemeData(
    // main colors
    scaffoldBackgroundColor: AppColors.primaryBackground,

    // Bottom nav bar theme
    bottomNavigationBarTheme: const BottomNavigationBarThemeData(
      backgroundColor: AppColors.secondaryBackground,
      selectedItemColor: AppColors.primary,
      unselectedItemColor: AppColors.primaryText,
      type: BottomNavigationBarType.fixed,
    ),

    // app bar theme
    appBarTheme: AppBarTheme(
      backgroundColor: AppColors.primaryBackground,
      elevation: 0,
      centerTitle: true,
      systemOverlayStyle: SystemUiOverlayStyle.light,
      titleTextStyle: _getTextStyle(
        fontSize: 18,
        color: AppColors.secondaryText,
      ),
    ),

    // text theme
    textTheme: TextTheme(
      titleMedium: _getTextStyle(
        fontSize: 20,
        color: AppColors.secondaryText,
      ),
      titleSmall: _getTextStyle(
        fontSize: 18,
        color: AppColors.secondaryText,
      ),
      bodyLarge: _getTextStyle(
        fontSize: 14,
        fontWeight: FontWeight.w400,
        color: AppColors.primaryText,
      ),
      bodyMedium: _getTextStyle(
        fontSize: 14,
        color: AppColors.secondaryText,
      ),
      bodySmall: _getTextStyle(
        fontSize: 12,
        fontWeight: FontWeight.w400,
        color: AppColors.primaryText,
      ),
    ),
  );
}

TextStyle _getTextStyle({
  required double fontSize,
  FontWeight fontWeight = FontWeight.w600,
  required Color color,
}) {
  return GoogleFonts.poppins(
    fontSize: fontSize,
    fontWeight: fontWeight,
    color: color,
  );
}

class AppTheme {
  static final flatButtonStyle = TextButton.styleFrom(
    textStyle: AppTypography.labelMedium,
    padding: const EdgeInsets.symmetric(horizontal: 16.0),
    shape: const RoundedRectangleBorder(
      borderRadius: BorderRadius.all(Radius.circular(2.0)),
    ),
  );

  static final raisedButtonStyle = ElevatedButton.styleFrom(
    foregroundColor: Colors.white,
    backgroundColor: AppColors.secondaryColor,
    textStyle: AppTypography.labelMedium,
    minimumSize: const Size(88, 36),
    padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
    shape: const RoundedRectangleBorder(
      borderRadius: BorderRadius.all(Radius.circular(20)),
    ),
  );

  static final outlineButtonStyle = OutlinedButton.styleFrom(
    textStyle: AppTypography.labelMedium,
    side: const BorderSide(color: AppColors.onPrimaryColor, width: 2),
    padding: const EdgeInsets.symmetric(horizontal: 16),
    shape: const RoundedRectangleBorder(
      borderRadius: BorderRadius.all(Radius.circular(20)),
    ),
  );

  static final lightThemeData = ThemeData(
    useMaterial3: true,
    primarySwatch: AppColors.primarySwatch,
    splashColor: AppColors.secondaryColor,
    scaffoldBackgroundColor: AppColors.backgroundColor,
    fontFamily: 'Urbanist',
    appBarTheme: AppBarTheme(
      // systemOverlayStyle: SystemUiOverlayStyle.light,
      backgroundColor: AppColors.backgroundColor,
      iconTheme: const IconThemeData(
        color: AppColors.onBackgroundColor,
      ),
      titleTextStyle: AppTypography.titleLarge.copyWith(
        color: AppColors.onPrimaryColor,
      ),
    ),
    textTheme: TextTheme(
      bodyLarge: AppTypography.bodyLarge.copyWith(
        color: AppColors.onPrimaryColor,
      ),
      bodyMedium: AppTypography.bodyMedium.copyWith(
        color: AppColors.onPrimaryColor,
      ),
      bodySmall: AppTypography.bodySmall.copyWith(
        color: AppColors.onPrimaryColor,
      ),
      labelLarge: AppTypography.labelLarge.copyWith(
        color: AppColors.onPrimaryColor,
      ),
      labelMedium: AppTypography.labelMedium.copyWith(
        color: AppColors.onPrimaryColor,
      ),
      labelSmall: AppTypography.labelSmall.copyWith(
        color: AppColors.onPrimaryColor,
      ),
      titleLarge: AppTypography.titleLarge.copyWith(
        color: AppColors.onPrimaryColor,
      ),
      titleMedium: AppTypography.titleMedium.copyWith(
        color: AppColors.onPrimaryColor,
      ),
      titleSmall: AppTypography.titleSmall.copyWith(
        color: AppColors.onPrimaryColor,
      ),
    ),
    colorScheme: const ColorScheme(
      brightness: Brightness.dark,
      primary: AppColors.primaryColor,
      onPrimary: AppColors.onPrimaryColor,
      secondary: AppColors.secondaryColor,
      onSecondary: AppColors.onSecondaryColor,
      background: AppColors.backgroundColor,
      onBackground: AppColors.onBackgroundColor,
      error: AppColors.errorColor,
      onError: AppColors.onErrorColor,
      surface: AppColors.surfaceColor,
      onSurface: AppColors.onSurfaceColor,
    ),
    elevatedButtonTheme: ElevatedButtonThemeData(style: raisedButtonStyle),
    textButtonTheme: TextButtonThemeData(style: flatButtonStyle),
    outlinedButtonTheme: OutlinedButtonThemeData(style: outlineButtonStyle),
    bottomSheetTheme:
        BottomSheetThemeData(backgroundColor: Colors.black.withOpacity(0)),
  );

  static final darkThemeData = ThemeData(
    useMaterial3: true,
    primarySwatch: AppColors.darkPrimarySwatch,
    splashColor: AppColors.darkSecondaryColor,
    scaffoldBackgroundColor: AppColors.darkBackgroundColor,
    fontFamily: 'Urbanist',
    appBarTheme: AppBarTheme(
      // systemOverlayStyle: SystemUiOverlayStyle.dark,
      backgroundColor: AppColors.darkBackgroundColor,
      iconTheme: const IconThemeData(
        color: AppColors.darkOnBackgroundColor,
      ),
      titleTextStyle: AppTypography.titleLarge.copyWith(
        color: AppColors.darkOnPrimaryColor,
      ),
    ),
    textTheme: TextTheme(
      bodyLarge: AppTypography.bodyLarge.copyWith(
        color: AppColors.darkOnPrimaryColor,
      ),
      bodyMedium: AppTypography.bodyMedium.copyWith(
        color: AppColors.darkOnPrimaryColor,
      ),
      bodySmall: AppTypography.bodySmall.copyWith(
        color: AppColors.darkOnPrimaryColor,
      ),
      labelLarge: AppTypography.labelLarge.copyWith(
        color: AppColors.darkOnPrimaryColor,
      ),
      labelMedium: AppTypography.labelMedium.copyWith(
        color: AppColors.darkOnPrimaryColor,
      ),
      labelSmall: AppTypography.labelSmall.copyWith(
        color: AppColors.darkOnPrimaryColor,
      ),
      titleLarge: AppTypography.titleLarge.copyWith(
        color: AppColors.darkOnPrimaryColor,
      ),
      titleMedium: AppTypography.titleMedium.copyWith(
        color: AppColors.darkOnPrimaryColor,
      ),
      titleSmall: AppTypography.titleSmall.copyWith(
        color: AppColors.darkOnPrimaryColor,
      ),
    ),
    colorScheme: const ColorScheme(
      brightness: Brightness.dark,
      primary: AppColors.darkPrimaryColor,
      onPrimary: AppColors.darkOnPrimaryColor,
      secondary: AppColors.darkSecondaryColor,
      onSecondary: AppColors.darkOnSecondaryColor,
      background: AppColors.darkBackgroundColor,
      onBackground: AppColors.darkOnBackgroundColor,
      error: AppColors.darkErrorColor,
      onError: AppColors.darkOnErrorColor,
      surface: AppColors.darkSurfaceColor,
      onSurface: AppColors.darkOnSurfaceColor,
    ),
    elevatedButtonTheme: ElevatedButtonThemeData(style: raisedButtonStyle),
    textButtonTheme: TextButtonThemeData(style: flatButtonStyle),
    outlinedButtonTheme: OutlinedButtonThemeData(style: outlineButtonStyle),
    bottomSheetTheme:
        BottomSheetThemeData(backgroundColor: Colors.black.withOpacity(0)),
  );
}
