import AppError from "../../errors/AppError";
import UserOnlineTime from "../../models/UserOnlineTime";
import { splitDateTime } from "../../helpers/SplitDateTime";
import { Op, Sequelize } from "sequelize";
import { addHours, addMinutes, addSeconds, intervalToDuration, add } from "date-fns";
import format from 'date-fns/format';
import ptBR from 'date-fns/locale/pt-BR'; 
import { stat } from "fs";

interface Request { 
    userId: string | number,
    status: string,  
}


const CreateOrUpdateUserOnlineTime = async ({  
    userId, 
    status,    
}: Request): Promise<UserOnlineTime> => {   

    let userOnlineTime = null;
   // let dateTime =  splitDateTime(new Date(new Date() + 'UTC'))

   let dateTime =  splitDateTime(new Date(format(new Date(), 'yyyy-MM-dd HH:mm:ss', { locale: ptBR })  ))
   

    userOnlineTime = await UserOnlineTime.findOne({ 
        where: { 
            [Op.and]: [
                {
                  userId: userId
                },
                { 
                    "$createdAt$": Sequelize.where(Sequelize.fn("date", Sequelize.col("createdAt")), `${dateTime.fullDate}`)
                }, 
              ] 
        } 
    }); 

    if(userOnlineTime){    
        try{   

            let oldStatus = userOnlineTime.status
            
            if(oldStatus=='online' && status === 'offline'){ 
                                                                            //updatedAt
                let newtTime = intervalToDuration({ start: userOnlineTime.updatedAt, end: new Date()})
                console.log('TESTANDO INTERVAL DURATION: ', newtTime)  

                console.log('hours: ', newtTime.hours, ' | minutes: ', newtTime.minutes, ' | seconds: ', newtTime.seconds)    
                
                let onlineTime = new Date()
    
                onlineTime.setUTCHours(userOnlineTime.onlineTime.getHours())
                onlineTime.setUTCMinutes(userOnlineTime.onlineTime.getMinutes())
                onlineTime.setUTCSeconds(userOnlineTime.onlineTime.getSeconds())
                
                console.log('userOnlineTime.onlineTime: ',userOnlineTime.onlineTime)
                console.log('userOnlineTime.onlineTime.getHours(): ',userOnlineTime.onlineTime.getHours())
                console.log('userOnlineTime.onlineTime.getMinutes(): ',userOnlineTime.onlineTime.getMinutes())
                console.log('userOnlineTime.onlineTime.getSeconds(): ',userOnlineTime.onlineTime.getSeconds())

                console.log('online time 3: ', onlineTime) 
            
                            
                if(newtTime.hours && +newtTime.hours > 0){  
                    onlineTime = addHours(onlineTime, newtTime.hours) 
                }
                if(newtTime.minutes && +newtTime.minutes > 0){  
                    onlineTime = addMinutes(onlineTime,newtTime.minutes)
                }
                if(newtTime.seconds && +newtTime.seconds > 0){  
                    onlineTime = addSeconds(onlineTime, newtTime.seconds)
                } 
                
                console.log('online time 4: ', onlineTime)   
    
                const isoDate = new Date(onlineTime);
                const mySQLDateString = isoDate.toJSON().slice(0, 19).replace('T', ' ');
                console.log('mySQLDateString: ', mySQLDateString)
            
                await userOnlineTime.update({ status, onlineTime: mySQLDateString })
                
            }
            else if(oldStatus=='offline' && status === 'online'){
                await userOnlineTime.update({ status })
            }
            else{
                console.log('NOT UPDATED THE USER: ', userOnlineTime.userId)
            }
             
        }catch(err){

            throw new AppError("ERR_NO_USER_ONLINE_FOUND", 404);
            
        }      
    }

    if(!userOnlineTime){ 

        userOnlineTime = await UserOnlineTime.create(
            {     
                userId,
                status,
                onlineTime: `${dateTime.fullDate} 00:00:00`
            })

    }
  

    return userOnlineTime
 }

 
  
 export default CreateOrUpdateUserOnlineTime