package mangavalk.canvasfirsttry;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.RectF;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Display;
import android.view.View;

public class CanvasView extends View {
    Resources r ;
    float dpHeight;
    float dpWidth;
    float Height;
    float Width;
    float moveX1,moveX2;
    float moveY1,moveY2;

    long oldTime;

    public CanvasView(Context context) {
        super(context);

        super.setBackgroundColor(Color.WHITE);
        oldTime = System.currentTimeMillis();

        this.postInvalidate();
    }

    public void SetActivity(Activity activity)
    {
        Display display = activity.getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics ();
        display.getMetrics(outMetrics);

        r = getResources();
        float density  = getResources().getDisplayMetrics().density;
        dpHeight = outMetrics.heightPixels / density;
        dpWidth  = outMetrics.widthPixels / density;
        Height = outMetrics.heightPixels;
        Width  = outMetrics.widthPixels;

        moveY1 = 50;
        moveY2 = 50;
    }

    int count = 0;

    @Override
    protected void onDraw(Canvas canvas) {
        count++;

        long newTime = System.currentTimeMillis();

        //drawText(canvas, count);
        DrawFps(canvas, newTime);
        drawPeddleRight(canvas, moveY1);
        drawPeddleLeft(canvas, moveY2);

        oldTime = newTime;

        //this.postInvalidateDelayed( 100 );
        this.postInvalidate();
    }

    private void drawRoundedRectangle(Canvas canvas) {
        // TODO Auto-generated method stub
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.MAGENTA);
        paint.setStyle(Style.FILL);
        int xPosition = 10;
        int yPosition = 350;
        int rectangleWidth = 100;
        int rectangleHeight = 50;
        RectF rect=new RectF(xPosition, yPosition, xPosition + rectangleWidth,
                yPosition + rectangleHeight);
        canvas.drawRoundRect(rect, 10,10, paint);
        paint.setStyle(Style.STROKE);
        xPosition = 150;
        rect=new RectF(xPosition, yPosition, xPosition + rectangleWidth,
                yPosition + rectangleHeight);
        canvas.drawRoundRect(rect, 10,10, paint);

    }

    private void drawRotatedImage(Canvas canvas) {
        // TODO Auto-generated method stub
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
                R.drawable.ic_launcher);
        bitmap = Bitmap.createScaledBitmap(bitmap, 100, 100, false);
        Matrix matrix = new Matrix();
        matrix.postRotate(60);// angle to rotate in clockwise direction
        matrix.postTranslate(200, 180);

        canvas.drawBitmap(bitmap, matrix, null);
    }

    private void DrawFps(Canvas canvas, long newTime)
    {
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setTextSize(30);
        String text = "FPS: " + (1000/(newTime-oldTime));
        canvas.drawText(text, GetRealPixelSize(dpWidth, 5), GetRealPixelSize(dpHeight, 5), paint);
    }

    float map(float x, float in_min, float in_max, float out_min, float out_max)
    {
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
    }

    private void drawPeddleRight(Canvas canvas, float i) {
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.BLACK);
        paint.setStyle(Style.FILL);

        float rectangleWidth = 2;
        float rectangleHeight = 20;

        float xPosition = 97;
        float yPosition = i;
        yPosition = yPosition <= (100-(rectangleHeight / 2))?yPosition:(100-(rectangleHeight / 2));
        yPosition = yPosition >= (rectangleHeight / 2)?yPosition:(rectangleHeight / 2);

        canvas.drawRect(
                GetRealPixelSize(dpWidth, xPosition),
                GetRealPixelSize(dpHeight, yPosition - (rectangleHeight / 2)),
                GetRealPixelSize(dpWidth, xPosition + (rectangleWidth)),
                GetRealPixelSize(dpHeight, yPosition + (rectangleHeight / 2)), paint);
    }

    private void drawPeddleLeft(Canvas canvas, float i) {
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.BLACK);
        paint.setStyle(Style.FILL);

        float rectangleWidth = 2;
        float rectangleHeight = 20;

        float xPosition = 3;
        float yPosition = i;
        yPosition = yPosition <= (100-(rectangleHeight / 2))?yPosition:(100-(rectangleHeight / 2));
        yPosition = yPosition >= (rectangleHeight / 2)?yPosition:(rectangleHeight / 2);

        canvas.drawRect(
                GetRealPixelSize(dpWidth, xPosition - (rectangleWidth)),
                GetRealPixelSize(dpHeight, yPosition - (rectangleHeight / 2)),
                GetRealPixelSize(dpWidth, xPosition),
                GetRealPixelSize(dpHeight, yPosition + (rectangleHeight / 2)), paint);
    }

    private float GetRealPixelSize(float dpWH, float DIP)
    {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (dpWH * ( DIP / 100 )), r.getDisplayMetrics());
    }

    private void drawImage(Canvas canvas) {
        // TODO Auto-generated method stub
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
                R.drawable.ic_launcher);
        bitmap = Bitmap.createScaledBitmap(bitmap, 100, 100, false);
        canvas.drawBitmap(bitmap, 10, 200, null);
    }

    private void drawRectangle(Canvas canvas) {
        // TODO Auto-generated method stub
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.RED);
        paint.setStyle(Style.FILL);
        int xPosition = 10;
        int yPosition = 150;
        int rectangleWidth = 100;
        int rectangleHeight = 50;
        canvas.drawRect(xPosition, yPosition, xPosition + rectangleWidth,
                yPosition + rectangleHeight, paint);
        paint.setStyle(Style.STROKE);
        xPosition = 150;
        canvas.drawRect(xPosition, yPosition, xPosition + rectangleWidth,
                yPosition + rectangleHeight, paint);
    }

    private void drawCircle(Canvas canvas) {
        // TODO Auto-generated method stub
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.BLUE);
        paint.setStyle(Style.FILL);
        canvas.drawCircle(50, 60, 50, paint);
        paint.setStyle(Style.STROKE);
        canvas.drawCircle(200, 60, 50, paint);
    }

    public void sendMove(float x, float y) {
        if (x / Width >= 0.6f)
        {
            moveX1 = (x / Width) * 100;
            moveY1 = (y / Height) * 100;
        }
        else if (x / Width <= 0.4f)
        {
            moveX2 = (x / Width) * 100;
            moveY2 = (y / Height) * 100;
        }
    }
}