package models;

import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;

import com.avaje.ebean.Model;
import com.fasterxml.jackson.databind.JsonNode;

import play.data.format.Formats.DateTime;
import play.data.validation.Constraints.Required;
import play.libs.Json;

@Entity
public class Image extends Model {

	@Id
	public Long id;

	@Required
	public String checksum;

	public String name;
	public String extension;
	public String imagePath;
	public String thumbnailPath;
	public String refImagePath;
	public String sobelImagePath;
	
	public int imageWidth;
	public int imageHeight;

	public int thumbnailWidth;
	public int thumbnailHeight;
	
	public String mainColor;
	public String avgColor;
	public String medColor;
	
	@Column(columnDefinition = "TEXT")
	public String signature;
	
	@DateTime(pattern = "dd/MM/yyyy")
	public Date created = new Date();

	@OneToMany(mappedBy="image")
	@OrderBy("count DESC")
	public List<ImageColor> colors;
	
	public static Finder<Long, Image> Find = new Finder<Long, Image>(Image.class);

	public static Image findOrCreate(final String checksum) {
		Image image = Find.where().eq("checksum", checksum).findUnique();
		if(image == null) {
			image = new Image();
			image.checksum = checksum;
			image.save();
		}
		return image;
	}
	
	public void setSignature(java.awt.Color[][] sigArray) {
		if(sigArray != null) {
			this.signature = Json.toJson(sigArray).toString().trim();
		}
	}	
	
	
	public Color[][] getSignature() {
		int x = 0;
		int y = 0;
		Color[][] sig = new Color[5][5];
		JsonNode sigArray = Json.parse(this.signature);
		if (sigArray.isArray()) {
			for (final JsonNode xNode : sigArray) {
				if (xNode.isArray()) {
					for (final JsonNode yNode : xNode) {
						sig[y][x] = Color.findOrCreate(yNode.get("red").asInt(), yNode.get("green").asInt(), yNode.get("blue").asInt());
						y++;
					}
				}
				y = 0;
				x++;
			}
		}
		return sig;
	}

	public String signatureAsMatrix() {
		StringBuilder sb = new StringBuilder();
		Color[][] sig = getSignature();
		for(int x = 0; x < sig.length; x++) {
			for(int y = 0; y < sig[x].length; y++) {
				sb.append(sig[x][y].toString())
				.append(",");
				
			}	
			sb.append("\n");
		}
		return sb.toString();
	}
	
	public String signatureAsString() {
		StringBuilder sb = new StringBuilder();
		Color[][] sig = getSignature();
		for(int x = 0; x < sig.length; x++) {
			for(int y = 0; y < sig[x].length; y++) {
				sb.append(x).append(":").append(y).append("=")
				.append(sig[x][y].toString())
				.append("\n");
			}			
		}
		return sb.toString();
	}
}