/*
 * Copyright 2017 Anton Tananaev (anton@traccar.org)
 * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.traccar.helper;

import org.traccar.model.BaseModel;

public final class LogAction {

    private LogAction() {
    }

    private static final String ACTION_CREATE = "create";
    private static final String ACTION_EDIT = "edit";
    private static final String ACTION_REMOVE = "remove";

    private static final String ACTION_LINK = "link";
    private static final String ACTION_UNLINK = "unlink";

    private static final String ACTION_LOGIN = "login";
    private static final String ACTION_LOGOUT = "logout";

    private static final String ACTION_TOTAL_DISTANCE = "resetTotalDistance";

    private static final String PATTERN_OBJECT = "User: %d, Action: %s, Object: %s, Id: %d";
    private static final String PATTERN_LINK = "User: %d, Action: %s, Owner: %s, Id: %d, Property: %s, Id: %d";
    private static final String PATTERN_LOGIN = "User: %d, Action: %s";
    private static final String PATTERN_TOTAL_DISTANCE = "User: %d, Action: %s, DeviceId: %d";

    public static void create(long userId, BaseModel object) {
        logObjectAction(ACTION_CREATE, userId, object.getClass(), object.getId());
    }

    public static void edit(long userId, BaseModel object) {
        logObjectAction(ACTION_EDIT, userId, object.getClass(), object.getId());
    }

    public static void remove(long userId, Class<?> clazz, long objectId) {
        logObjectAction(ACTION_REMOVE, userId, clazz, objectId);
    }

    public static void link(long userId, Class<?> owner, long ownerId, Class<?> property, long propertyId) {
        logLinkAction(ACTION_LINK, userId, owner, ownerId, property, propertyId);
    }

    public static void unlink(long userId, Class<?> owner, long ownerId, Class<?> property, long propertyId) {
        logLinkAction(ACTION_UNLINK, userId, owner, ownerId, property, propertyId);
    }

    public static void login(long userId) {
        logLoginAction(ACTION_LOGIN, userId);
    }

    public static void logout(long userId) {
        logLoginAction(ACTION_LOGOUT, userId);
    }

    public static void resetTotalDistance(long userId, long deviceId) {
        log(String.format(PATTERN_TOTAL_DISTANCE, userId, ACTION_TOTAL_DISTANCE, deviceId));
    }

    private static void logObjectAction(String action, long userId, Class<?> clazz, long objectId) {
        log(String.format(PATTERN_OBJECT, userId, action, clazz.getSimpleName(), objectId));
    }

    private static void logLinkAction(String action, long userId,
            Class<?> owner, long ownerId, Class<?> property, long propertyId) {
        log(String.format(PATTERN_LINK, userId, action,
                owner.getSimpleName(), ownerId, property.getSimpleName(), propertyId));
    }

    private static void logLoginAction(String action, long userId) {
        log(String.format(PATTERN_LOGIN, userId, action));
    }

    private static void log(String msg) {
        Log.info(msg);
    }

}

@@ -695,16 +695,49 @@
 elper;%0A%0A
+import java.beans.Introspector;%0A%0A
 import o
@@ -1354,25 +1354,25 @@
 N_OBJECT = %22
-U
+u
 ser: %25d, Act
@@ -1360,33 +1360,33 @@
 CT = %22user: %25d, 
-A
+a
 ction: %25s, Objec
@@ -1380,17 +1380,17 @@
 on: %25s, 
-O
+o
 bject: %25
@@ -1388,25 +1388,25 @@
 object: %25s, 
-I
+i
 d: %25d%22;%0A    
@@ -1445,25 +1445,25 @@
 ERN_LINK = %22
-U
+u
 ser: %25d, Act
@@ -1451,33 +1451,33 @@
 NK = %22user: %25d, 
-A
+a
 ction: %25s, Owner
@@ -1471,17 +1471,17 @@
 on: %25s, 
-O
+o
 wner: %25s
@@ -1486,17 +1486,17 @@
 %25s, 
-I
+i
 d: %25d, 
-P
+p
 rope
@@ -1504,17 +1504,17 @@
 ty: %25s, 
-I
+i
 d: %25d%22;%0A
@@ -1558,25 +1558,25 @@
 RN_LOGIN = %22
-U
+u
 ser: %25d, Act
@@ -1564,33 +1564,33 @@
 IN = %22user: %25d, 
-A
+a
 ction: %25s%22;%0A    
@@ -1643,17 +1643,17 @@
 ANCE = %22
-U
+u
 ser: %25d,
@@ -1653,17 +1653,17 @@
 er: %25d, 
-A
+a
 ction: %25
@@ -1665,17 +1665,17 @@
 on: %25s, 
-D
+d
 eviceId:
@@ -3058,16 +3058,42 @@
 action, 
+Introspector.decapitalize(
 clazz.ge
@@ -3105,16 +3105,17 @@
 leName()
+)
 , object
@@ -3345,16 +3345,42 @@
         
+Introspector.decapitalize(
 owner.ge
@@ -3392,16 +3392,17 @@
 leName()
+)
 , ownerI
@@ -3395,33 +3395,75 @@
 ame()), ownerId,
- 
+%0A                Introspector.decapitalize(
 property.getSimp
@@ -3470,16 +3470,17 @@
 leName()
+)
 , proper

Decapitalize words in log patterns