from datetime import datetime, timedelta
from apscheduler.schedulers.background import BackgroundScheduler
import db

scheduler = BackgroundScheduler()
_socketio = None
_current_index = 0


def init_scheduler(socketio):
    global _socketio
    _socketio = socketio
    scheduler.start()
    reload_jobs()
    reload_sleep_jobs()


def reload_jobs():
    global _current_index
    _current_index = 0
    try:
        scheduler.remove_job('rotation')
    except Exception:
        pass
    jobs = db.get_enabled_jobs()
    if not jobs:
        return
    _emit_and_schedule(jobs[0])


def _advance():
    global _current_index
    jobs = db.get_enabled_jobs()
    if not jobs:
        return
    _current_index = (_current_index + 1) % len(jobs)
    _emit_and_schedule(jobs[_current_index])


def _emit_and_schedule(job):
    if _socketio:
        _socketio.emit('switch', {
            'type':                job['type'],
            'source':              job['source'],
            'scheduled':           True,
            'shuffle':             bool(job.get('shuffle')),
            'show_chat':           bool(job.get('show_chat')),
            'transition_type':     job.get('transition_type') or '',
            'transition_duration': int(job.get('transition_duration') or 0),
        })
        db.set_current(job['type'], job['source'])
    scheduler.add_job(
        func=_advance,
        trigger='date',
        run_date=datetime.now() + timedelta(minutes=job['duration']),
        id='rotation',
        replace_existing=True
    )


# --- Söv-läge ---

def _sleep_on():
    if _socketio:
        _socketio.emit('sleep_toggle', {'active': True})


def _sleep_off():
    if _socketio:
        _socketio.emit('sleep_toggle', {'active': False})


def reload_sleep_jobs():
    for jid in ('sleep_on', 'sleep_off'):
        try:
            scheduler.remove_job(jid)
        except Exception:
            pass

    state = db.get_state()
    if state.get('sleep_enabled') != '1':
        return

    start = state.get('sleep_start', '22:00')
    end   = state.get('sleep_end',   '07:00')
    try:
        sh, sm = map(int, start.split(':'))
        eh, em = map(int, end.split(':'))
    except Exception:
        return

    scheduler.add_job(_sleep_on,  'cron', hour=sh, minute=sm, id='sleep_on',  replace_existing=True)
    scheduler.add_job(_sleep_off, 'cron', hour=eh, minute=em, id='sleep_off', replace_existing=True)
