package page.image;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Locale;

import javax.imageio.ImageIO;

import org.wikiwebserver.core.WareHouse;
import org.wikiwebserver.distribute.interfaces.WorkerNode;
import org.wikiwebserver.distribute.server.NodeOfflineException;
import org.wikiwebserver.distribute.server.WorkerNodeManager;
import org.wikiwebserver.handler.http.FormData;
import org.wikiwebserver.handler.http.interfaces.*;
import org.wikiwebserver.util.CacheableDynamicImage;

import page.tools.entity.NodeData;

public class NodeAvatar extends CacheableDynamicImage implements HTTPResponder {
    
    private String state = states[1];
    private String system = systems[0];
    private String os = null;
    private String flag = null;
    private String security = null;
	
    protected void init(FormData formData) {
        
        setSize(56, 56);
        
        if (formData == null) return;
        
        String nodeID = formData.getFirst("nodeID");
        if (nodeID == null) return;

        
        NodeData nodeData = NodeData.getNodeDataById(nodeID);
        if (nodeData != null) {
            
            if (nodeData.requiresPassword()) {
                security = padLock;
            }            
            
            String osName = (String) nodeData.get("osName");
            if (osName == null) {
                
            }
            else if (osName.equals("Mac OS X")) {
                os = oss[0];
                system = systems[0];
            }
            else if (osName.equals("Linux")) {
                os = oss[1];
                system = systems[0];
            }         
            else if (osName.equals("Windows Vista")) {
                os = oss[2];
                system = systems[0];
            }
            else if (osName.startsWith("Windows")) {
                os = oss[3];
                system = systems[0];
            }
            else if (osName.equals("SunOS")) {
                os = oss[4];
                system = systems[0];
            }               
            
            
            WorkerNode node = WorkerNodeManager.getNode(nodeData.getId());
            try {
                node.getWaitTime();
                state = states[0];
            }
            catch (NodeOfflineException ex) {
                state = states[1];
            }

            
            String country = (String) nodeData.get("country");
            if (country == null || country.length() == 0) {
                country = (String) nodeData.get("lastRequestCountry");                    
            }

            if (country == null || country.length() == 0 ||
                country.equalsIgnoreCase("Unknown")) {
                
                country = "UNITED KINGDOM";
            }
            
            Locale[] locales = Locale.getAvailableLocales();
            for (int i = 0; i < locales.length; i++) {
                String countryName = locales[i].getDisplayCountry();
                if (countryName != null && countryName.length() > 0) {
                    if (countryName.equalsIgnoreCase(country)) {                        
                        String reqFlag = locales[i].getCountry().toLowerCase() + ".gif";                            
                        for (int j=0; j<flags.length; j++) {
                            if (flags[j].equals(reqFlag)) {
                                flag = flags[j];
                                return;
                            }
                        }
                    }
                }
            }
        }
    }
    
    @Override
    public String getCacheKey() {
        return state + system + os + flag + security;
    } 
    
    @Override
    public long getExpireTime() {
        return System.currentTimeMillis() + 60000;
    };
    
    protected void paint(Graphics2D g2d) throws IOException {
        
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);        
        g2d.setColor(Color.white);
        g2d.fillRect(0, 0, getWidth(), getHeight());
        
        File stateFile = WareHouse.getResourceFile(stateRoot + state);
        BufferedImage stateImage = ImageIO.read(stateFile);
        g2d.drawImage(stateImage, 0, 0, null);          
        
        File systemFile = WareHouse.getResourceFile(systemRoot + system);
        BufferedImage systemImage = ImageIO.read(systemFile);
        g2d.drawImage(systemImage, 0, 0, null);            
        
        if (os != null) {
            File osFile = WareHouse.getResourceFile(osRoot + os);
            BufferedImage osImage = ImageIO.read(osFile);
            g2d.drawImage(osImage, 0, getHeight()-osImage.getHeight(), null);                
        }
        
        if (flag != null) {
            File flagFile = WareHouse.getResourceFile(flagRoot + flag);
            BufferedImage flagImage = ImageIO.read(flagFile);
            g2d.drawImage(flagImage, getWidth()-flagImage.getWidth(), 0, null);            
        }
        
        if (security != null) {
            File securityFile = WareHouse.getResourceFile(miscRoot + security);
            BufferedImage securityImage = ImageIO.read(securityFile);
            g2d.drawImage(securityImage, getWidth()-securityImage.getWidth(), 
                          getHeight()-securityImage.getHeight(), null);            
        }        

    }     
    
    private static final String stateRoot = "templates/default/icons/state/";    
    private static final String systemRoot = "templates/default/icons/system/";
    private static final String osRoot = "templates/default/icons/os/";
    private static final String flagRoot = "templates/default/icons/flags/";
    private static final String miscRoot = "templates/default/icons/misc/";  
    
    private static final String padLock = "padlock.gif";
    
    private static final String[] states = {
        "online.png", "offline.png",
    };
    
    private static final String[] systems = {
        "Computer.png", "PortableComputer.png", "Smartphone.png"
    };
    
    private static final String[] oss = {
        "Apple_Blue.png", "Linux.png", "Vista.png", "Windows.png", "Sun.gif" 
    };    

    private static final String[] flags = {
        "ad.gif", "ae.gif",  "af.gif",  "ag.gif",  "ai.gif",  "al.gif",  "am.gif",  
        "an.gif",  "ao.gif",  "ar.gif",  "as.gif",  "at.gif",  "au.gif",  "aw.gif",  
        "ax.gif",  "az.gif",  "ba.gif",  "bb.gif",  "bd.gif",  "be.gif",  "bf.gif",  
        "bg.gif",  "bh.gif",  "bi.gif",  "bj.gif",  "bm.gif",  "bn.gif",  "bo.gif",  
        "br.gif",  "bs.gif",  "bt.gif",  "bv.gif",  "bw.gif",  "by.gif",  "bz.gif",  
        "ca.gif",  "catalonia.gif",  "cc.gif",  "cd.gif",  "cf.gif",  "cg.gif",  "ch.gif",  
        "ci.gif",  "ck.gif",  "cl.gif",  "cm.gif",  "cn.gif",  "co.gif",  "cr.gif",  
        "cs.gif",  "cu.gif",  "cv.gif",  "cx.gif",  "cy.gif",  "cz.gif",  "de.gif",  
        "dj.gif",  "dk.gif",  "dm.gif",  "do.gif",  "dz.gif",  "ec.gif",  "ee.gif",  
        "eg.gif",  "eh.gif",  "england.gif",  "er.gif",  "es.gif",  "et.gif",  
        "europeanunion.gif",  "fam.gif",  "fi.gif",  "fj.gif",  "fk.gif",  "fm.gif",  
        "fo.gif",  "fr.gif",  "ga.gif",  "gb.gif",  "gd.gif",  "ge.gif",  "gf.gif",  
        "gh.gif",  "gi.gif",  "gl.gif",  "gm.gif",  "gn.gif",  "gp.gif",  "gq.gif",  
        "gr.gif",  "gs.gif",  "gt.gif",  "gu.gif",  "gw.gif",  "gy.gif",  "hk.gif",  
        "hm.gif",  "hn.gif",  "hr.gif",  "ht.gif",  "hu.gif",  "id.gif",  "ie.gif",  
        "il.gif",  "in.gif",  "io.gif",  "iq.gif",  "ir.gif",  "is.gif",  "it.gif",  
        "jm.gif",  "jo.gif",  "jp.gif",  "ke.gif",  "kg.gif",  "kh.gif",  "ki.gif",  
        "km.gif",  "kn.gif",  "kp.gif",  "kr.gif",  "kw.gif",  "ky.gif",  "kz.gif",  
        "la.gif",  "lb.gif",  "lc.gif",  "li.gif",  "lk.gif",  "lr.gif",  "ls.gif",  
        "lt.gif",  "lu.gif",  "lv.gif",  "ly.gif",  "ma.gif",  "mc.gif",  "md.gif",  
        "me.gif",  "mg.gif",  "mh.gif",  "mk.gif",  "ml.gif",  "mm.gif",  "mn.gif",  
        "mo.gif",  "mp.gif",  "mq.gif",  "mr.gif",  "ms.gif",  "mt.gif",  "mu.gif",  
        "mv.gif",  "mw.gif",  "mx.gif",  "my.gif",  "mz.gif",  "na.gif",  "nc.gif",  
        "ne.gif",  "nf.gif",  "ng.gif",  "ni.gif",  "nl.gif",  "no.gif",  "np.gif",  
        "nr.gif",  "nu.gif",  "nz.gif",  "om.gif",  "pa.gif",  "pe.gif",  "pf.gif",  
        "pg.gif",  "ph.gif",  "pk.gif",  "pl.gif",  "pm.gif",  "pn.gif",  "pr.gif",  
        "ps.gif",  "pt.gif",  "pw.gif",  "py.gif",  "qa.gif",  "re.gif",  "ro.gif",  
        "rs.gif",  "ru.gif",  "rw.gif",  "sa.gif",  "sb.gif",  "sc.gif",  "scotland.gif",  
        "sd.gif",  "se.gif",  "sg.gif",  "sh.gif",  "si.gif",  "sj.gif",  "sk.gif",  
        "sl.gif",  "sm.gif",  "sn.gif",  "so.gif",  "sr.gif",  "st.gif",  "sv.gif",  
        "sy.gif",  "sz.gif",  "tc.gif",  "td.gif",  "tf.gif",  "tg.gif",  "th.gif",  
        "tj.gif",  "tk.gif",  "tl.gif",  "tm.gif",  "tn.gif",  "to.gif",  "tr.gif",  
        "tt.gif",  "tv.gif",  "tw.gif",  "tz.gif",  "ua.gif",  "ug.gif",  "um.gif",  
        "us.gif",  "uy.gif",  "uz.gif",  "va.gif",  "vc.gif",  "ve.gif",  "vg.gif",  
        "vi.gif",  "vn.gif",  "vu.gif",  "wales.gif",  "wf.gif",  "ws.gif",  "ye.gif",  
        "yt.gif",  "za.gif",  "zm.gif",  "zw.gif", 
    };
        
}