package com.kbs.kbsintranett;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class AlarmScheduler {

    private static final String TAG = "AlarmScheduler";
    private static final String PREFS_NAME = "kbs_alarm_history";

    /**
     * Denne metoden går gjennom en liste hendelser og setter alarmer for dem.
     */
    public static void scheduleAlarmsForEvents(Context context, List<CalendarEvent> events) {
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        // Sjekk rettigheter for Android 12+ (Exact Alarm)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && !alarmManager.canScheduleExactAlarms()) {
            Log.w(TAG, "Mangler rettighet til å sette nøyaktige alarmer.");
            return;
        }

        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        long now = System.currentTimeMillis();
        SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault());

        // Vi ser etter hendelser 30 dager frem i tid
        long futureWindow = now + (30L * 24 * 60 * 60 * 1000L);

        for (CalendarEvent event : events) {
            try {
                // Hopp over hvis ingen dato eller heldags (uten tidspunkt)
                if (event.getRawDate() == null || event.getRawDate().length() == 10) continue;

                Date eventDate = null;
                if (event.getRawDate().contains("T")) {
                    String raw = event.getRawDate();
                    if (raw.length() > 19) raw = raw.substring(0, 19);
                    eventDate = isoFormat.parse(raw);
                }

                if (eventDate == null) continue;

                // Loop gjennom alle varsler (f.eks. 15 min før, 60 min før)
                for (int minutesBefore : event.getReminders()) {
                    if (minutesBefore < 0) continue;

                    long triggerTime = eventDate.getTime() - (minutesBefore * 60 * 1000L);
                    String alarmKey = "alarm_" + event.getId() + "_" + triggerTime;

                    // Hvis tidspunktet er i fremtiden (og innenfor vinduet)
                    if (triggerTime > now && triggerTime < futureWindow) {

                        // Sjekk om vi allerede har satt denne alarmen for å unngå dobbeltarbeid
                        if (prefs.getBoolean(alarmKey, false)) {
                            continue;
                        }

                        int alarmId = alarmKey.hashCode(); // Unik ID basert på hendelse+tid

                        Intent intent = new Intent(context, AlarmReceiver.class);
                        intent.putExtra("TITLE", event.getTitle());
                        String timeStr = new SimpleDateFormat("HH:mm", Locale.getDefault()).format(eventDate);
                        intent.putExtra("MESSAGE", "Starter kl " + timeStr);
                        intent.putExtra("ID", alarmId);

                        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                context,
                                alarmId,
                                intent,
                                PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
                        );

                        // Sett alarmen
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
                        } else {
                            alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
                        }

                        // Marker som satt
                        prefs.edit().putBoolean(alarmKey, true).apply();
                        Log.d(TAG, "Alarm satt for " + event.getTitle() + " om " + minutesBefore + " min.");
                    }
                }
            } catch (Exception e) {
                Log.e(TAG, "Feil ved setting av alarm", e);
            }
        }
    }
}