from fw import log
from fw import core
from fw import datetime
from config import core as core_config
from app.model.setting import Setting,Settings
from app.model.channel import Channel,Channels

#低速モードを実行する
async def on_event():
    log.d('start')
    try:
        #Discordサーバーを取得する
        guild=core.get_guild()
        if guild == None:
            log.d("end no guild")
            return
    
        #低速モード指定用に全チャンネルを取得する
        slowmode_channels = guild.channels
        if slowmode_channels is None:
            slowmode_channels = []
    
        async def setChannelsSlowmodeDelay(delay):
            log.d('start')

            for channel in slowmode_channels:
                try:
                    #チャンネル毎の低速モードOn/Offの設定に沿う
                    db_channel=Channels().first(channel.id)
                    #設定値の取得失敗の場合、終了
                    if db_channel==None:
                        log.d('no db_channel')
                        continue
                    #低速モードオフの場合、delayは強制0
                    if db_channel.slowmode_flg==0:
                        log.d('slowmode_flg:0 c_id:'+str(channel.id))
                        delay=0
                    #チャンネル属性がカテゴリであれば、終了
                    if channel.type == core.channel_type.category:
                        log.d('category channel')
                        continue
                    #低速値に更新なければ、終了
                    if channel.slowmode_delay == delay:
                        log.d('delay no changed')
                        continue
                    #低速モード実行
                    await channel.edit(slowmode_delay=delay)
                except Exception as e:
                    log.w('catch '+str(e))
                    log.w('delay:'+str(delay))
                    log.w('channel:'+str(channel))
                
            log.d('end')
            return

        #低速モードON/OFFをDBから取得する
        slowmode_on = Settings().first(category='slowmode', setting='slowmode_on')
        if slowmode_on==None:
            log.w('slowmode_on is nothing')
            log.d('end')
            return
    
        #低速モードがOFFの場合
        if (slowmode_on.value == '0'):
            log.i('mode_off')
            await setChannelsSlowmodeDelay(0)
            log.d('end')
            return
    
        #低速モード開始時間をDBから取得する
        start_at = Settings().first(category='slowmode', setting='start_at')
        if start_at==None:
            log.w('start_at is nothing')
            log.d('end')
            return

        #低速モード終了時間をDBから取得する
        end_at = Settings().first(category='slowmode', setting='end_at')
        if end_at==None:
            log.w('end_at is nothing')
            log.d('end')
            return

        #低速モード時間をDBから取得する
        slowmode_time = Settings().first(category='slowmode', setting='slowmode_time')
        if slowmode_time==None:
            log.w('slowmode_time is nothing')
            log.d('end')
            return

        #今の日本時間を取得する
        dt_now = datetime.now()
    
        #低速モード実行時間を設定する
        dt_start = datetime.str_to_dt(start_at.value, '%H:%M:%S')
        dt_end = datetime.str_to_dt(end_at.value, '%H:%M:%S')
    
        if dt_start == dt_end:
            log.i('mode_on set:on')
            await setChannelsSlowmodeDelay(slowmode_time.value)
            log.d('end')
            return
    
        if dt_start < dt_end:
            #指定時間内の場合
            if (dt_now.time() >= dt_start.time() and dt_now.time() <= dt_end.time()):
                #低速モードON
                log.i('mode_on set:on')
                await setChannelsSlowmodeDelay(slowmode_time.value)
    
            #指定時間外の場合
            else:
                #低速モードOFF
                log.i('mode_on set:off')
                await setChannelsSlowmodeDelay(0)
            
            log.d('end')
            return
    
        if dt_start > dt_end:
            #指定時間内の場合
            if (dt_now.time() >= dt_start.time() or dt_now.time() <= dt_end.time()):
                #低速モードON
                log.i('mode_on set:on')
                await setChannelsSlowmodeDelay(slowmode_time.value)
    
            #指定時間外の場合
            else:
                #低速モードOFF
                log.i('mode_on set:off')
                await setChannelsSlowmodeDelay(0)
            
            log.d('end')
            return

    except Exception as e:
        print(e)
        log.e(str(e))
        raise e

    log.d('end')
    return
