package org.ntlab.radishforandroidstudio.framework.RWT;

import android.content.res.Resources;
import android.opengl.GLUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TableLayout;

import org.ntlab.radishforandroidstudio.framework.model3D.Position3D;
import org.ntlab.radishforandroidstudio.java3d.GraphicsContext3D;
import org.ntlab.radishforandroidstudio.java3d.ImageComponent2D;
import org.ntlab.radishforandroidstudio.java3d.Texture;
import org.ntlab.radishforandroidstudio.java3d.TextureLoader;

import java.util.ArrayList;

/**
 * 画像管理クラス
 * 座標は左下が原点であることに注意(DirectXは左上のため)
 *
 * @author s.iwatani
 */
public class RWTSprite implements RWTDrawable {
    private int[] textureId = null;
    private ImageComponent2D image = null;
    private boolean isDraw = true;

    // 表示座標
    private Position3D pos = new Position3D(0.f, 0.f, 0.f);
    private Position3D texSize = new Position3D(0.f, 0.f, 0.f);
    private Position3D texPos = new Position3D(0.f, 0.f, 0.f);
    private Position3D viewSize = new Position3D(0.f, 0.f, 0.f);

    public RWTSprite() {
    }

    /**
     * 表示する座標を取得
     *
     * @author s.iwatani
     * @return Position3D
     */
    final public Position3D getPosition() {
        return pos;
    }

    /**
     * 表示サイズを取得
     *
     * @author s.iwatani
     * @return Position3D
     */
    final public Position3D getViewSize() {
        return viewSize;
    }

    /**
     * 画像サイズを取得
     *
     * @author s.iwatani
     * @return Position3D
     */
    final public Position3D getTextureSize() {
        return texSize;
    }

    /**
     * 描画する座標をセット
     *
     * @author s.iwatani
     * @param x x座標
     * @param y y座標
     */
    public void setPosition(float x, float y) {
        pos.setX(x);
        pos.setY(y);
    }

    /**
     * 描画する座標をセット
     * @param pos Position3D
     */
    public void setPosition(Position3D pos) {
        setPosition((float)pos.getX(), (float)pos.getY());
    }

    /**
     * テクスチャをセット
     *
     * @author s.iwatani
     * @param res Resources
     * @param id リソースのID R.drawable.なんちゃらみたいなやつ
     *
     * TODO: 画像サイズが元と違うため,そのサイズが元のものになるようにする
     *       Bitmap.createScaledBitmap(robot, 100, 100, false);のやつ
     */
    public void setTexture(Resources res, int id, boolean isEnableAlpha) {
        RWTImageLoader texLoader = new RWTImageLoader(res, id,
                                        TextureLoader.BY_REFERENCE | TextureLoader.Y_UP,
                                        isEnableAlpha ? ImageComponent2D.FORMAT_RGBA : ImageComponent2D.FORMAT_RGB);
        image = texLoader.getImage();
        Texture tex = texLoader.getTexture();
        Log.v("moji", "faaa");
        Log.v("moji",  ((Double)(texLoader.getSize().getX())).toString() + ", " + ((Double)(texLoader.getSize().getY())).toString());
        Log.v("moji", "faaa");

        texPos.setX(0.f);
        texPos.setY(image.getBitmap().getHeight());
        texSize.setX(image.getBitmap().getWidth());
        texSize.setY(-image.getBitmap().getHeight());
        pos.set(0.0, 0.0, 0.0);
        viewSize.setX((float)image.getBitmap().getWidth());
        viewSize.setY((float)image.getBitmap().getHeight());
    }

    /**
     * 画像を描画する
     *
     * @author s.iwatani
     * @param gc3D GL10
     */
    public void draw(GraphicsContext3D gc3D) {
        if (!getIsDraw()) {
            return;
        }

        if (textureId == null) {
            textureId = new int[1];
            textureId[0] = gc3D.loadImage(image);
        }
        gc3D.draw(textureId[0], pos, texPos, texSize, viewSize);
    }

    /**
     * 描画するかしないかをセット
     *
     * @author s.iwatani
     * @param isDraw trueで描画する
     */
    @Override
    public void setIsDraw(boolean isDraw) {
        this.isDraw = isDraw;
    }

    /**
     * 描画するかしないかを取得
     *
     * @author s.iwatani
     * @return boolean
     */
    @Override
    public boolean getIsDraw() {
        return isDraw;
    }
}
