/*
 * The Seventh
 * see license.txt 
 */
package seventh.client.gfx.effects;

import seventh.client.gfx.AnimatedImage;
import seventh.client.gfx.Camera;
import seventh.client.gfx.Canvas;
import seventh.math.Vector2f;
import seventh.shared.TimeStep;

import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.TextureRegion;

/**
 * @author Tony
 *
 */
public class DebugAnimationEffect implements Effect {

    private AnimatedImage anim;
    private Vector2f pos;
    private boolean persist;
    private FadeValue fade;
    private float rotation;
    private Sprite sprite;
    
    private int offsetX, offsetY;
    
    /**
     * @param anim
     * @param pos
     * @param persist
     */
    public DebugAnimationEffect(AnimatedImage anim, Vector2f pos, float rotation) {
        this(anim, pos, rotation, false);
    }
    
    /**
     * @param anim
     * @param pos
     * @param persist
     */
    public DebugAnimationEffect(AnimatedImage anim, Vector2f pos, float rotation, boolean persist) {
        this(anim, pos, rotation, persist, 4000);
    }

    /**
     * @param anim
     * @param pos
     * @param persist
     */
    public DebugAnimationEffect(AnimatedImage anim, Vector2f pos, float rotation, boolean persist, int fadeTime) {
        super();
        this.anim = anim;
        this.pos = pos;
        this.persist = persist;
        this.rotation = rotation;
        this.fade = new FadeValue(255, 0, fadeTime);
        
        this.sprite = new Sprite(anim.getCurrentImage());
        this.sprite.flip(false, true);
    }
    
    public void setOffset(int x, int y) {
        this.offsetX = x;
        this.offsetY = y;
    }
    
    /* (non-Javadoc)
     * @see leola.live.gfx.Renderable#render(leola.live.gfx.Canvas, leola.live.gfx.Camera, long)
     */
    @Override
    public void render(Canvas canvas, Camera camera, float a) {
            
        int rx = (int)(pos.x);
        int ry = (int)(pos.y);
        
        float alpha = 1.0f;
        if(!this.persist) {
             alpha = (float)this.fade.getCurrentValue() / 255.0f;
        }
        
        float priorAlpha = canvas.getCompositeAlpha();
        canvas.setCompositeAlpha(alpha);
        
        TextureRegion region = anim.getCurrentImage();
        sprite.setRegion(region);
                
        if(offsetX != 0 || offsetY != 0) {
            //sprite.setSize(16, 16);
            sprite.setPosition(rx-offsetX, ry-offsetY);
            //sprite.setPosition(rx+22, ry-43);
            sprite.setOrigin(offsetX, offsetY);
        }
        else {
            int w = region.getRegionWidth() / 2;
            int h = region.getRegionHeight() / 2;
            
            sprite.setPosition(rx-w, ry-h);
        }
        sprite.setRotation(this.rotation-90);
        
//        sprite.setColor(1, 1, 1, alpha);
        canvas.drawSprite(sprite);
        canvas.drawRect( (int)sprite.getX(), (int)sprite.getY(), sprite.getRegionWidth(), sprite.getRegionHeight(), 0xff00aa00);
        canvas.setCompositeAlpha(priorAlpha);
    }
    
    /* (non-Javadoc)
     * @see leola.live.gfx.Renderable#update(leola.live.TimeStep)
     */
    @Override
    public void update(TimeStep timeStep) {    
        anim.update(timeStep);
        
//        if(anim.isDone() && this.persist) {
//            anim.reset();
//        }
        
        if(!this.persist) {
            this.fade.update(timeStep);
        }
    }

    /* (non-Javadoc)
     * @see seventh.client.gfx.particle.Effect#isDone()
     */
    @Override
    public boolean isDone() {
        return !persist && anim.isDone() && this.fade.isDone();
    }

    /* (non-Javadoc)
     * @see seventh.client.gfx.particle.Effect#destroy()
     */
    @Override
    public void destroy() {        
    }
}