package com.lemenzo.clock.bedtime;
import android.app.*;import android.content.*;import java.util.*;
public final class BedtimeScheduler {
    private static final int BEDTIME_CODE=5501,WAKE_CODE=5502,SUNRISE_CODE=5503;private BedtimeScheduler(){}
    public static void schedule(Context c){BedtimeRepository r=new BedtimeRepository(c);AlarmManager m=c.getSystemService(AlarmManager.class);if(m==null)return;PendingIntent bedtime=PendingIntent.getBroadcast(c,BEDTIME_CODE,new Intent(c,BedtimeReceiver.class),PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);PendingIntent wake=PendingIntent.getBroadcast(c,WAKE_CODE,new Intent(c,BedtimeWakeReceiver.class).setAction(BedtimeWakeReceiver.FIRE),PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);PendingIntent sunrise=PendingIntent.getActivity(c,SUNRISE_CODE,new Intent(c,BedtimeSunriseActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP),PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);if(!r.enabled()){m.cancel(bedtime);m.cancel(wake);m.cancel(sunrise);return;}m.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,next(r.hour(),r.minute(),r.days()),bedtime);long wakeAt=next(r.wakeHour(),r.wakeMinute(),r.days());PendingIntent show=PendingIntent.getActivity(c,WAKE_CODE,new Intent(c,BedtimeWakeActivity.class),PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);m.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeAt,show),wake);if(r.sunriseEnabled()){long sunriseAt=wakeAt-15*60*1000L;if(sunriseAt>System.currentTimeMillis())m.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,sunriseAt,sunrise);}else m.cancel(sunrise);}
    public static long next(int hour,int minute,Set<Integer> days){Calendar now=Calendar.getInstance();for(int add=0;add<8;add++){Calendar x=(Calendar)now.clone();x.add(Calendar.DAY_OF_YEAR,add);x.set(Calendar.HOUR_OF_DAY,hour);x.set(Calendar.MINUTE,minute);x.set(Calendar.SECOND,0);x.set(Calendar.MILLISECOND,0);if(x.getTimeInMillis()>System.currentTimeMillis()&&days.contains(x.get(Calendar.DAY_OF_WEEK)))return x.getTimeInMillis();}return System.currentTimeMillis()+24*60*60*1000L;}
}
