from fw import log
from fw import core
from fw import datetime
from app.model.user import User,Users
from app.model.channel import Channel,Channels
from app.model.vc_score import VcScore,VcScores

async def on_event():
    log.d('start')
    try:
        #サーバー情報を取得する
        guild=core.get_guild()
        if guild == None:
            log.d("end no guild")
            return
    
        #サーバー情報から、ボイスチャンネルを抜き出す
        voice_channels=guild.voice_channels
        if voice_channels is None:
            voice_channels = []

        target_date=datetime.now()
        
        #ボイスチャンネルを周回する
        for vc in voice_channels:
    
            #DBのチャンネルテーブルから対象のc_idのチャンネル情報を取得する
            channel=Channels().first(vc.id)
            if channel==None:
                continue
            
            #スコア対象外
            if channel.except_flg==1:
                continue
        
            #チャンネル情報からチャンネルIDを取得する
            channel_id=channel.id
            
            #ボイスチャンネルに入っているメンバーを取得する
            vc_members=vc.members
            if vc_members is None:
                vc_members = []
            
            #Botメンバーを除く
            bot_exist_flg = True
            while bot_exist_flg:
                bot_exist_flg=False
                bot_member=None
                for member in vc_members:
                    if member.bot:
                        bot_member=member
                        bot_exist_flg=True
                        break
                
                if bot_member!=None:
                    vc_members.remove(bot_member)

            #メンバーを周回する
            for member in vc_members:
                sec_flg=True
                non_active_sec_flg=False
                active_sec_flg=False
                active_mute_sec_flg=False

                #ミュート状態を取得する
                mute=member.voice.self_mute
                g_mute=member.voice.mute

                #1人だと非アクティブ
                if len(vc_members)==1:
                    non_active_sec_flg=True
                #2人以上かつミュート/サーバーミュートしてるとアクティブミュート
                elif mute or g_mute:
                    active_mute_sec_flg=True
                #デフォルト(2人以上かつ非ミュート)だとアクティブ
                else:
                    active_sec_flg=True

                #DBのユーザーテーブルから対象のu_idのユーザー情報を取得する
                user=Users().first(member.id)
                if user==None:
                    continue
                
                #ユーザー情報からユーザーIDを取得する
                user_id=user.id
                
                #DBのボイスチャンネルスコアテーブルから
                #対象のチャンネルID、ユーザーIDのボイスチャンネルスコア情報を取得する
                vc_score=VcScores().first(user_id,channel_id,target_date)
                
                if vc_score==None:
                    log.i("new:" + str(user_id) + "," + str(channel_id))
                    VcScores().new(user_id,channel_id,target_date)
                    vc_score=VcScores().first(user_id,channel_id,target_date)
                
                if sec_flg==True:
                    #ボイスチャンネルスコア情報から時間を取得する
                    vc_sec=vc_score.sec
                    
                    #時間に30足す
                    vc_sec=vc_sec+30
                    
                    #DBのボイスチャンネルスコアテーブルの
                    #ボイスチャンネルスコア情報を更新する
                    log.i("set_sec:" + str(vc_score.id) + "," + str(vc_sec))
                    VcScores().set_sec(vc_score.id,vc_sec)
                
                if non_active_sec_flg==True:
                    #ボイスチャンネルスコア情報から時間を取得する
                    vc_non_active_sec=vc_score.non_active_sec
    
                    #時間に30足す
                    vc_non_active_sec=vc_non_active_sec+30
                    
                    #DBのボイスチャンネルスコアテーブルの
                    #ボイスチャンネルスコア情報を更新する
                    log.i("set_non_active_sec:" + str(vc_score.id) + "," + str(vc_non_active_sec))
                    VcScores().set_non_active_sec(vc_score.id,vc_non_active_sec)
                
                if active_sec_flg==True:
                    #ボイスチャンネルスコア情報から時間を取得する
                    vc_active_sec=vc_score.active_sec
    
                    #時間に30足す
                    vc_active_sec=vc_active_sec+30
                    
                    #DBのボイスチャンネルスコアテーブルの
                    #ボイスチャンネルスコア情報を更新する
                    log.i("set_active_sec:" + str(vc_score.id) + "," + str(vc_active_sec))
                    VcScores().set_active_sec(vc_score.id,vc_active_sec)
                
                if active_mute_sec_flg==True:
                    #ボイスチャンネルスコア情報から時間を取得する
                    vc_active_mute_sec=vc_score.active_mute_sec
    
                    #時間に30足す
                    vc_active_mute_sec=vc_active_mute_sec+30
                    
                    #DBのボイスチャンネルスコアテーブルの
                    #ボイスチャンネルスコア情報を更新する
                    log.i("set_active_mute_sec:" + str(vc_score.id) + "," + str(vc_active_mute_sec))
                    VcScores().set_active_mute_sec(vc_score.id,vc_active_mute_sec)

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

    log.d('end')
    return
