import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/widgets.dart';
import 'package:relative_time/relative_time.dart';

extension DurationFormatter on Duration {
  String formatDuration() {
    final isNegative = inMicroseconds < 0;
    final positiveDuration = isNegative ? -this : this;

    final hours = positiveDuration.inHours.toString().padLeft(2, '0');
    final minutes = (positiveDuration.inMinutes % 60).toString().padLeft(
      2,
      '0',
    );
    final seconds = (positiveDuration.inSeconds % 60).toString().padLeft(
      2,
      '0',
    );

    return '${isNegative ? '-' : ''}$hours:$minutes:$seconds';
  }

  String formatOffset() {
    final isNegative = inMicroseconds < 0;
    final positiveDuration = isNegative ? -this : this;

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

    return '${isNegative ? '-' : '+'}$hours:$minutes';
  }

  String formatOffsetLocal() {
    // Get the local timezone offset
    final localOffset = DateTime.now().timeZoneOffset;

    // Add the local offset to the input duration
    final totalOffset = this - localOffset;

    final isNegative = totalOffset.inMicroseconds < 0;
    final positiveDuration = isNegative ? -totalOffset : totalOffset;

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

    return '${isNegative ? '-' : '+'}$hours:$minutes';
  }
}

extension DateTimeFormatter on DateTime {
  String formatSystem() {
    return DateFormat.yMd().add_jm().format(toLocal());
  }

  String formatCustom(String pattern) {
    return DateFormat(pattern).format(toLocal());
  }

  String formatCustomGlobal(String pattern) {
    return DateFormat(pattern).format(this);
  }

  String formatWithLocale(String locale) {
    return DateFormat.yMd().add_jm().format(toLocal()).toString();
  }

  String formatRelative(BuildContext context) {
    return RelativeTime(context).format(toLocal());
  }
}