package no.agens.depth.headers;

import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader;
import android.graphics.Xfermode;

import com.github.florent37.depth.lib.MathHelper;

public class NoiseEffect extends Renderable {

    private Paint paint = new Paint();
    BitmapShader shader;
    Matrix matrix;
    float scale;

    public NoiseEffect(Bitmap bitmap, int grainFPS, float scale) {
        super(bitmap, 0, 0);
        shader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
        matrix = new Matrix();

        shader.setLocalMatrix(matrix);
        paint.setShader(shader);
        paint.setAlpha(144);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
        lastGrainOffset = System.currentTimeMillis();
        this.grainFPS = grainFPS;
        this.scale=scale;
    }

    @Override
    public void draw(Canvas canvas) {

        canvas.drawPaint(paint);
    }

    long lastGrainOffset;
    private int grainFPS;

    @Override
    public void update(float deltaTime, float wind) {
        if (lastGrainOffset + grainFPS < System.currentTimeMillis()) {
            matrix.reset();
            matrix.setScale(scale, scale);
            matrix.postTranslate(MathHelper.randomRange(-bitmap.getWidth() * 10f, bitmap.getWidth() * 10f), MathHelper.randomRange(-bitmap.getHeight() * 10f, bitmap.getHeight() * 10f));
            shader.setLocalMatrix(matrix);
            lastGrainOffset = System.currentTimeMillis();

        }
    }

    private static final Xfermode[] sModes = {
            new PorterDuffXfermode(PorterDuff.Mode.CLEAR),
            new PorterDuffXfermode(PorterDuff.Mode.SRC),
            new PorterDuffXfermode(PorterDuff.Mode.DST),
            new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),
            new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
            new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
            new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
            new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),
            new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),
            new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),
            new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),
            new PorterDuffXfermode(PorterDuff.Mode.XOR),
            new PorterDuffXfermode(PorterDuff.Mode.DARKEN),
            new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),
            new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),
            new PorterDuffXfermode(PorterDuff.Mode.SCREEN)
    };

    public void setNoiseIntensity(float noiseIntensity) {
        paint.setAlpha((int) (255f * noiseIntensity));
    }
}