import 'package:intl/intl.dart';

class DateTimeUtils {
  DateTimeUtils._();

  static const _locale = 'id_ID';

  static String yyyyMMdd(DateTime date) {
    return DateFormat('yyyy-MM-dd', _locale).format(date);
  }

  static String ddMMMyyyy(DateTime date) {
    return DateFormat('dd MMM yyyy', _locale).format(date);
  }

  static String ddMMMMyyyy(DateTime date) {
    return DateFormat('dd MMMM yyyy', _locale).format(date);
  }

  static String ddMMMyyyyHHmm(DateTime date) {
    return DateFormat('dd MMM yyyy HH:mm', _locale).format(date);
  }

  static String hhMM(DateTime date) {
    return DateFormat('HH:mm', _locale).format(date);
  }

  static String hhMMss(DateTime date) {
    return DateFormat('HH:mm:ss', _locale).format(date);
  }

  static String dayDDMMMMyyyy(DateTime date) {
    return DateFormat('EEEE, dd MMMM yyyy', _locale).format(date);
  }

  static String dayDDMMMMyyyyHHmm(DateTime date) {
    return DateFormat('EEEE, dd MMMM yyyy HH:mm:ss', _locale).format(date);
  }

  static DateTime? parse(String? value) {
    if (value == null || value.isEmpty) return null;
    return DateTime.tryParse(value);
  }

  static String toApi(DateTime date) {
    return DateFormat("yyyy-MM-dd'T'HH:mm:ss", _locale).format(date);
  }

  static String timeAgo(DateTime date) {
    final diff = DateTime.now().difference(date);

    if (diff.inSeconds < 60) {
      return '${diff.inSeconds} detik lalu';
    } else if (diff.inMinutes < 60) {
      return '${diff.inMinutes} menit lalu';
    } else if (diff.inHours < 24) {
      return '${diff.inHours} jam lalu';
    } else if (diff.inDays < 7) {
      return '${diff.inDays} hari lalu';
    }

    return dayDDMMMMyyyy(date);
  }

  static String formatDateTimeWithGMT(DateTime date) {
    final formatted = DateFormat(
      'MMM dd, yyyy hh:mm:ss a',
      _locale,
    ).format(date);

    final offset = date.timeZoneOffset;

    final sign = offset.isNegative ? '-' : '+';

    final hours = offset.inHours.abs().toString().padLeft(2, '0');
    final minutes = (offset.inMinutes.abs() % 60).toString().padLeft(2, '0');

    return '$formatted GMT$sign$hours:$minutes';
  }
}
