#include <iostream>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <assert.h>

//#include "Utils.h"
//#include "PVRTC.h"
#include "Image.h"
//#include "Image.cpp"


void error(const char* message)
{
  printf("error: %s\n", message);
  exit(-1);
}


void test_case(const char* inputFile, const char* beforeFile, const char* afterFile)
{
  // Load the file
  ByteArray inputData;
  Image inputImage;
  if (!LoadFile(inputFile, inputData))
    error("couldn't load file");
  if (!DecodeTGA(inputData, inputImage))
    error("couldn't decode tga");

  printf("loaded\n");
  printf("fmt: %i  bpp: %i\n", inputImage.m_type, (inputImage.m_type == RAW_RGBA_32BPP) ? 32 : 24);

  // Write the texture prior to compression
  ByteArray outData;
  if (!EncodeTGA(inputImage, outData))
    error("couldn't encode tga");
  if (!SaveFile(beforeFile, outData))
    error("couldn't save file");

  Image pvrImage;
  if (!ConvertImage(inputImage, pvrImage, PVRTC_RGBA_4BPPV1))
    error("couldn't convert file to pvr");

  if (!SaveFile(std::string(afterFile + std::string(".pvr")).c_str(), pvrImage.m_data))
    error("couldn't save pvr file");

  Image outputImage;
  if (!ConvertImage(pvrImage, outputImage, inputImage.m_type))
    error("couldn't convert file to pvr");

  printf("after fmt: %i  bpp: %i\n", outputImage.m_type, (outputImage.m_type == RAW_RGBA_32BPP) ? 32 : 24);

  // Write the texture post compression
  ByteArray outDataPost;
  if (!EncodeTGA(outputImage, outDataPost))
    error("couldn't encode tga");
  if (!SaveFile(afterFile, outDataPost))
    error("couldn't save file");
}


int main(int argc, char **argv)
{
  test_case("globe.tga", "globe_before.tga", "globe_after.tga");
  test_case("alpha.tga", "alpha_before.tga", "alpha_after.tga");
  return 0;
}


