package com.lemenzo.clock.timer;
import android.app.*;import android.content.*;import android.media.*;import android.net.Uri;import android.os.*;import android.provider.Settings;import com.lemenzo.clock.R;import com.lemenzo.clock.notifications.NotificationChannels;import com.lemenzo.clock.settings.ClockSettings;import java.util.*;
public final class TimerService extends android.app.Service {
    public static final String ACTION_REMOVE="com.lemenzo.clock.timer.REMOVE_RINGING";private static final LinkedHashSet<Long> ringing=new LinkedHashSet<>();private MediaPlayer player;private Vibrator vibrator;private NotificationManager nm;
    public static synchronized long currentTimerId(){return ringing.isEmpty()?-1:ringing.iterator().next();}
    @Override public int onStartCommand(Intent i,int flags,int startId){if(i==null)return START_NOT_STICKY;long id=i.getLongExtra(TimerIntentActions.EXTRA_ID,-1);if(ACTION_REMOVE.equals(i.getAction())){remove(id);return START_NOT_STICKY;}TimerItem t=new TimerRepository(this).get(id);if(t==null){remove(id);return START_NOT_STICKY;}synchronized(TimerService.class){ringing.add(id);}nm=getSystemService(NotificationManager.class);Notification n=notification(t);if(ringing.size()==1)startForeground(notificationId(t.id),n);else if(nm!=null)nm.notify(notificationId(t.id),n);ensureRinging();int timeout=new ClockSettings(this).silenceAfterMinutes();if(timeout>0)new Handler(Looper.getMainLooper()).postDelayed(()->remove(id),timeout*60000L);return START_NOT_STICKY;}
    private void remove(long id){synchronized(TimerService.class){ringing.remove(id);}if(nm==null)nm=getSystemService(NotificationManager.class);if(nm!=null)nm.cancel(notificationId(id));Long next=null;synchronized(TimerService.class){if(!ringing.isEmpty())next=ringing.iterator().next();}if(next==null){stopSelf();return;}TimerItem t=new TimerRepository(this).get(next);if(t!=null)startForeground(notificationId(next),notification(t));}
    private Notification notification(TimerItem t){Intent full=new Intent(this,TimerRingingActivity.class).putExtra(TimerIntentActions.EXTRA_ID,t.id).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);PendingIntent fs=PendingIntent.getActivity(this,TimerScheduler.code(t.id)^41,full,PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);PendingIntent add=action(t.id,TimerIntentActions.ADD_MINUTE,42),dismiss=action(t.id,TimerIntentActions.DISMISS,43);String title=t.label.isEmpty()?getString(R.string.timer_ringing_title):t.label;return new Notification.Builder(this,NotificationChannels.TIMERS).setSmallIcon(R.drawable.ic_notification_clock).setContentTitle(title).setContentText(getString(R.string.timer_finished)).setCategory(Notification.CATEGORY_ALARM).setVisibility(Notification.VISIBILITY_PUBLIC).setOngoing(true).setFullScreenIntent(fs,true).addAction(new Notification.Action.Builder(null,getString(R.string.add_minute),add).build()).addAction(new Notification.Action.Builder(null,getString(R.string.dismiss),dismiss).build()).build();}
    private PendingIntent action(long id,String action,int salt){return PendingIntent.getBroadcast(this,TimerScheduler.code(id)^salt,new Intent(this,TimerReceiver.class).setAction(action).putExtra(TimerIntentActions.EXTRA_ID,id),PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);}
    private void ensureRinging(){if(player==null){try{Uri uri=Settings.System.DEFAULT_ALARM_ALERT_URI;player=new MediaPlayer();player.setAudioAttributes(new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM).setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).build());player.setDataSource(this,uri);player.setLooping(true);player.prepare();player.start();}catch(Exception ignored){}}if(vibrator==null&&new ClockSettings(this).timerVibrate()){vibrator=getSystemService(Vibrator.class);if(vibrator!=null)vibrator.vibrate(VibrationEffect.createWaveform(new long[]{0,650,300,650},0));}}
    @Override public void onDestroy(){synchronized(TimerService.class){ringing.clear();}if(player!=null){try{player.stop();}catch(Exception ignored){}player.release();player=null;}if(vibrator!=null)vibrator.cancel();stopForeground(STOP_FOREGROUND_REMOVE);super.onDestroy();}
    @Override public IBinder onBind(Intent i){return null;}private static int notificationId(long id){return 2200+(int)(Math.abs(id)%10000);}
}