#include "media_processor.h"
#include <stdio.h>
#include <assert.h>
#include <string.h>

void test_detect_type() {
    printf("Testing media_detect_type...\n");

    // Images
    assert(media_detect_type("photo.jpg") == MEDIA_TYPE_IMAGE);
    assert(media_detect_type("photo.JPEG") == MEDIA_TYPE_IMAGE);
    assert(media_detect_type("image.png") == MEDIA_TYPE_IMAGE);
    assert(media_detect_type("animation.gif") == MEDIA_TYPE_IMAGE);
    assert(media_detect_type("modern.webp") == MEDIA_TYPE_IMAGE);
    assert(media_detect_type("apple.heic") == MEDIA_TYPE_IMAGE);

    // Videos
    assert(media_detect_type("video.mp4") == MEDIA_TYPE_VIDEO);
    assert(media_detect_type("movie.mov") == MEDIA_TYPE_VIDEO);
    assert(media_detect_type("clip.avi") == MEDIA_TYPE_VIDEO);
    assert(media_detect_type("stream.mkv") == MEDIA_TYPE_VIDEO);
    assert(media_detect_type("web.webm") == MEDIA_TYPE_VIDEO);

    // Audio
    assert(media_detect_type("song.mp3") == MEDIA_TYPE_AUDIO);
    assert(media_detect_type("audio.wav") == MEDIA_TYPE_AUDIO);
    assert(media_detect_type("music.flac") == MEDIA_TYPE_AUDIO);

    // Unknown
    assert(media_detect_type("document.pdf") == MEDIA_TYPE_UNKNOWN);
    assert(media_detect_type("archive.zip") == MEDIA_TYPE_UNKNOWN);
    assert(media_detect_type("noextension") == MEDIA_TYPE_UNKNOWN);

    printf("  PASSED\n");
}

void test_get_extension() {
    printf("Testing media_get_extension...\n");

    assert(strcmp(media_get_extension("file.jpg"), ".jpg") == 0);
    assert(strcmp(media_get_extension("path/to/file.mp4"), ".mp4") == 0);
    assert(strcmp(media_get_extension("multiple.dots.png"), ".png") == 0);
    assert(media_get_extension("noextension") == NULL);
    assert(media_get_extension(NULL) == NULL);

    printf("  PASSED\n");
}

void test_path_safety() {
    printf("Testing media_path_is_safe...\n");

    // Safe paths
    assert(media_path_is_safe("file.jpg") == true);
    assert(media_path_is_safe("folder/file.jpg") == true);
    assert(media_path_is_safe("a/b/c/file.jpg") == true);

    // Unsafe paths
    assert(media_path_is_safe("../file.jpg") == false);
    assert(media_path_is_safe("folder/../file.jpg") == false);
    assert(media_path_is_safe("/absolute/path.jpg") == false);
    assert(media_path_is_safe(NULL) == false);

    printf("  PASSED\n");
}

void test_generate_id() {
    printf("Testing media_generate_id...\n");

    char* id1 = media_generate_id();
    char* id2 = media_generate_id();

    assert(id1 != NULL);
    assert(id2 != NULL);
    assert(strlen(id1) > 0);
    assert(strlen(id2) > 0);
    assert(strcmp(id1, id2) != 0);  // Should be unique

    free(id1);
    free(id2);

    printf("  PASSED\n");
}

void test_default_opts() {
    printf("Testing media_processor_opts_default...\n");

    MediaProcessorOpts opts = media_processor_opts_default("./output");

    assert(opts.output_dir != NULL);
    assert(strcmp(opts.output_dir, "./output") == 0);
    assert(opts.image_quality == 80);
    assert(opts.video_segment_duration == 6);
    assert(opts.generate_thumbnail == true);

    printf("  PASSED\n");
}

int main() {
    printf("\n=== Media Processor Tests ===\n\n");

    test_detect_type();
    test_get_extension();
    test_path_safety();
    test_generate_id();
    test_default_opts();

    printf("\n=== All tests passed! ===\n\n");
    return 0;
}
