package dk.itu.mario.engine;

import java.awt.*;
import java.util.Random;


import dk.itu.mario.level.Level;


public class BgRenderer
{
    private int xCam;
    private int yCam;
    private Image image;
    private Graphics2D g;
    private static final Color transparent = new Color(0, 0, 0, 0);
    private Level level;

    private Random random = new Random();
    public boolean renderBehaviors = false;

    private int width;
    private int height;
    private int distance;

    public BgRenderer(Level level, GraphicsConfiguration graphicsConfiguration, int width, int height, int distance)
    {
        this.distance = distance;
        this.width = width;
        this.height = height;

        this.level = level;
        image = graphicsConfiguration.createCompatibleImage(width, height, Transparency.BITMASK);
        g = (Graphics2D) image.getGraphics();
        g.setComposite(AlphaComposite.Src);

        updateArea(0, 0, width, height);
    }

    public void setCam(int xCam, int yCam)
    {
        xCam /= distance;
        yCam /= distance;
        int xCamD = this.xCam - xCam;
        int yCamD = this.yCam - yCam;
        this.xCam = xCam;
        this.yCam = yCam;

        g.setComposite(AlphaComposite.Src);
        g.copyArea(0, 0, width, height, xCamD, yCamD);

        if (xCamD < 0)
        {
            if (xCamD < -width) xCamD = -width;
            updateArea(width + xCamD, 0, -xCamD, height);
        }
        else if (xCamD > 0)
        {
            if (xCamD > width) xCamD = width;
            updateArea(0, 0, xCamD, height);
        }

        if (yCamD < 0)
        {
            if (yCamD < -width) yCamD = -width;
            updateArea(0, height + yCamD, width, -yCamD);
        }
        else if (yCamD > 0)
        {
            if (yCamD > width) yCamD = width;
            updateArea(0, 0, width, yCamD);
        }
    }

    private void updateArea(int x0, int y0, int w, int h)
    {
        g.setBackground(transparent);
        g.clearRect(x0, y0, w, h);
        int xTileStart = (x0 + xCam) / 32;
        int yTileStart = (y0 + yCam) / 32;
        int xTileEnd = (x0 + xCam + w) / 32;
        int yTileEnd = (y0 + yCam + h) / 32;
        for (int x = xTileStart; x <= xTileEnd; x++)
        {
            for (int y = yTileStart; y <= yTileEnd; y++)
            {
                int b = level.getBlock(x, y) & 0xff;
                g.drawImage(Art.bg[b % 8][b / 8], (x << 5) - xCam, (y << 5) - yCam-16, null);
            }
        }
    }

    public void render(Graphics g, int tick, float alpha)
    {
        g.drawImage(image, 0, 0, null);
    }

    public void setLevel(Level level)
    {
        this.level = level;
        updateArea(0, 0, width, height);
    }
}
