package org.wikiwebserver.util.connector;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Map;

import org.wikiwebserver.core.Privilege;
import org.wikiwebserver.core.WikiMap;
import org.wikiwebserver.handler.http.HTTPHandler;
import org.wikiwebserver.handler.http.interfaces.HTTPResponder;

import page.config.SiteMonitor;
import page.tools.entity.User;

public class ImportUsers implements HTTPResponder {
    

    @SuppressWarnings({ "rawtypes" })
    public Object respond(HTTPHandler conn) throws IOException {
        conn.getResponse().getHeaders().set("Content-Type", "text/plain");
        
        File importDir = new File("import/users");
        for (File file : importDir.listFiles()) {
            if (!file.getName().endsWith(".wws")) continue;
            try {
                ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
                Object objMap = in.readObject();
                if (objMap instanceof Map) {
                    User u = importUser((Map)objMap);
                    conn.getOutputStream().write("Importing: " + u.getEmail() + "\r\n");
                }
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }    
    
    @SuppressWarnings("rawtypes")
	private static User importUser(Map data) {
        String email = null;
        String passwordHash = null;
        Privilege privilege = null;
        for (Object obj : ((Map)data).entrySet()) {
            if (obj instanceof Map.Entry) {
                Object key = ((Map.Entry)obj).getKey();
                Object value = ((Map.Entry)obj).getValue();
                if (key.toString().equals("email")) {
                    email = value.toString();
                }
                if (key.toString().equals("passwordHash")) {
                    passwordHash = value.toString();
                }          
                if (key.toString().equals("privilege")) {
                    privilege = Privilege.getPrivilegeFromValue(((Integer)value).intValue());                    
                }                

            }
        }

        User u = User.getUserByEmail(email);
        if (u == null && email != null && passwordHash != null) {
            System.out.println("Importing: " + email + " " + passwordHash + " " + privilege);            
            u = User.createNewUser(email, passwordHash, privilege); 
        }
        
        importData("resetPasswordTime", data, u);
        importData("userAgent", data, u);
        importData("resetPasswordHash", data, u);
        importData("lastRequestTime", data, u);
        importData("firstRequestTime", data, u);
        importData("bytesUploaded", data, u);
        importData("bytesDownloaded", data, u);
        importData("fullname", data, u);
        importData("profile", data, u);
        importData("sessionIP", data, u);
        importData("numVisits", data, u);
        importData("website", data, u);
        importData("createdTime", data, u);
        importData("numRequests", data, u);
        importData("lastRequestAddress", data, u);
        importData("country", data, u);
        importData("lastRequestCountry", data, u);
        
        ((WikiMap) SiteMonitor.getStatistic("UserAccessTimes"))
            .put(u.getId(), data.get("lastRequestTime"));
        
        return u;
    }
    
    @SuppressWarnings({ "rawtypes" })
    private static void importData(String key, Map data, User user) {
        Object obj = data.get(key);
        if (obj != null) user.put(key, obj);
    }
}

