package helper

import (
	"authentication/models"
	"authentication/services"
	"encoding/json"
	"time"
)

func LogEvent(id string, user *string, ipAddress string, actType int, fieldUpdate interface{}) error {

	fieldUpdated := new(json.RawMessage)
	if fieldUpdate != nil {
		data, err := json.Marshal(fieldUpdate)
		if err != nil {
			LogError(err, "Error marshalling field update")
			return err
		}
		fieldUpdated = (*json.RawMessage)(&data)
	}

	params := models.LogEventParams{
		ActivityType: actType,
		IPAddress:    ipAddress,
		FieldUpdated: fieldUpdated,
		ErrorMessage: ErrorFailedtoLogLoginEvent,
	}
	return LogLoginEventParams(params, ipAddress)
}

func LogLoginEventV2(id string, ipAddress string) error {

	params := models.LogEventParams{
		ActivityType: 17,
		IPAddress:    ipAddress,
		FieldUpdated: new(json.RawMessage),
		ErrorMessage: ErrorFailedtoLogLoginEvent,
	}
	return LogLoginEventParams(params, ipAddress)
}

func LogLoginEventParams(params models.LogEventParams, ipAddress string) error {
	location, err := LoadAsiaManilaLocation()
	if err != nil {
		LogError(err, "Failed to load Asia/Manila timezone, using UTC+8 offset")
	}
	currentTime := time.Now().In(location)
	accessLog := models.UserAccessLog{
		UserID:        params.UserID,
		ParticipantID: params.ParticipantID,
		ActivityType:  params.ActivityType,
		IPAddress:     ipAddress,
		FieldUpdated:  params.FieldUpdated,
		Time:          currentTime,
	}
	err = services.InsertAccessLogLogin(accessLog)
	if err != nil {
		LogError(err, params.ErrorMessage)
		return err
	}
	return nil
}
