/* See COPYING.txt for the full license governing this code. */
/**
 * \file screenshot.c 
 *
 * Source file for the screenshot API.
 */

#include "SDL_visualtest_mischelper.h"
#include <SDL_test.h>

int
SDLVisualTest_VerifyScreenshots(char* args, char* test_dir, char* verify_dir)
{
    int i, verify_len, return_code, test_len;
    char hash[33];
    char* verify_path; /* path to the bmp file used for verification */
    char* test_path; /* path to the bmp file to be verified */
    SDL_RWops* rw;
    SDL_Surface* verifybmp;

    return_code = 1;

    if(!args)
    {
        SDLTest_LogError("args argument cannot be NULL");
        return_code = -1;
        goto verifyscreenshots_cleanup_generic;
    }
    if(!test_dir)
    {
        SDLTest_LogError("test_dir argument cannot be NULL");
        return_code = -1;
        goto verifyscreenshots_cleanup_generic;
    }
    if(!verify_dir)
    {
        SDLTest_LogError("verify_dir argument cannot be NULL");
        return_code = -1;
        goto verifyscreenshots_cleanup_generic;
    }

    /* generate the MD5 hash */
    SDLVisualTest_HashString(args, hash);

    /* find the verification image */
    /* path_len + hash_len + some number of extra characters */
    verify_len = SDL_strlen(verify_dir) + 32 + 10;
    verify_path = (char*)SDL_malloc(verify_len * sizeof(char));
    if(!verify_path)
    {
        SDLTest_LogError("malloc() failed");
        return_code = -1;
        goto verifyscreenshots_cleanup_generic;
    }
    SDL_snprintf(verify_path, verify_len - 1,
                 "%s/%s.bmp", verify_dir, hash);
    rw = SDL_RWFromFile(verify_path, "rb");
    if(!rw)
    {
        SDLTest_Log("Verification image does not exist."
                    " Please manually verify that the SUT is working correctly.");
        return_code = 2;
        goto verifyscreenshots_cleanup_verifypath;
    }

    /* load the verification image */
    verifybmp = SDL_LoadBMP_RW(rw, 1);
    if(!verifybmp)
    {
        SDLTest_LogError("SDL_LoadBMP_RW() failed");
        return_code = -1;
        goto verifyscreenshots_cleanup_verifypath;
    }

    /* load the test images and compare with the verification image */
    /* path_len + hash_len + some number of extra characters */
    test_len = SDL_strlen(test_dir) + 32 + 10;
    test_path = (char*)SDL_malloc(test_len * sizeof(char));
    if(!test_path)
    {
        SDLTest_LogError("malloc() failed");
        return_code = -1;
        goto verifyscreenshots_cleanup_verifybmp;
    }

    for(i = 1; ; i++)
    {
        SDL_RWops* testrw;
        SDL_Surface* testbmp;

        if(i == 1)
            SDL_snprintf(test_path, test_len - 1, "%s/%s.bmp", test_dir, hash);
        else
            SDL_snprintf(test_path, test_len - 1, "%s/%s_%d.bmp", test_dir, hash, i);
        testrw = SDL_RWFromFile(test_path, "rb");
        
        /* we keep going until we've iterated through the screenshots each
           SUT window */
        if(!testrw)
            break;

        /* load the test screenshot */
        testbmp = SDL_LoadBMP_RW(testrw, 1);
        if(!testbmp)
        {
            SDLTest_LogError("SDL_LoadBMP_RW() failed");
            return_code = -1;
            goto verifyscreenshots_cleanup_verifybmp;
        }

        /* compare with the verification image */
        if(SDLTest_CompareSurfaces(testbmp, verifybmp, 0) != 0)
        {
            return_code = 0;
            SDL_FreeSurface(testbmp);
            goto verifyscreenshots_cleanup_verifybmp;
        }

        SDL_FreeSurface(testbmp);
    }

    if(i == 1)
    {
        SDLTest_LogError("No verification images found");
        return_code = -1;
    }

verifyscreenshots_cleanup_verifybmp:
    SDL_FreeSurface(verifybmp);

verifyscreenshots_cleanup_verifypath:
    SDL_free(verify_path);

verifyscreenshots_cleanup_generic:
    return return_code;
}
