import 'package:flutter/material.dart';
import 'package:timezone/data/latest.dart' as tz;
import 'package:timezone/timezone.dart' as tz;

class AppTime {
  static bool _initialized = false;

  static void initialize({String location = 'Asia/Manila'}) {
    if (_initialized) return;
    tz.initializeTimeZones();
    tz.setLocalLocation(tz.getLocation(location));
    _initialized = true;
  }

  static DateTime now() {
    return tz.TZDateTime.now(tz.local);
  }

  static DateTime nowUtc() {
    return now().toUtc();
  }

  static DateTime toAppTime(DateTime value) {
    final utc = value.isUtc ? value : value.toUtc();
    return tz.TZDateTime.from(utc, tz.local);
  }

  static DateTime parse(String value) {
    return toAppTime(DateTime.parse(value));
  }

  /// Converts a [DateTime] into a human-readable short date string.
  ///
  /// Example: **Jan 05, 2025**. This matches the format previously used by
  /// `_formatDate` helpers across multiple screens.
  static String formatDate(DateTime value) {
    const months = [
      'Jan',
      'Feb',
      'Mar',
      'Apr',
      'May',
      'Jun',
      'Jul',
      'Aug',
      'Sep',
      'Oct',
      'Nov',
      'Dec',
    ];
    final month = months[value.month - 1];
    final day = value.day.toString().padLeft(2, '0');
    return '$month $day, ${value.year}';
  }

  /// Formats a [DateTimeRange] as ``start - end`` using [formatDate].
  static String formatDateRange(DateTimeRange range) {
    return '${formatDate(range.start)} - ${formatDate(range.end)}';
  }

  /// Renders a [DateTime] in 12‑hour clock notation with AM/PM suffix.
  ///
  /// Example: **08:30 PM**. Used primarily in workforce-related screens.
  static String formatTime(DateTime value) {
    final rawHour = value.hour;
    final hour = (rawHour % 12 == 0 ? 12 : rawHour % 12).toString().padLeft(
      2,
      '0',
    );
    final minute = value.minute.toString().padLeft(2, '0');
    final suffix = rawHour >= 12 ? 'PM' : 'AM';
    return '$hour:$minute $suffix';
  }
}
