/*
 * palfile — тест палитровых хелперов: gfx_pal_sync / gfx_pal_fsave /
 * gfx_pal_fload.  Программные проверки (gfx_pal_get_color), MAME —
 * только хост.
 *
 *   P1 fsave: сохранить дефолтную палитру 0 → PAL0.PAL (1024 Б).
 *   P2 fload: испортить слоты 1 и 200 → fload(0) вернул 256 и ОБА
 *      слота восстановились (полный файл).
 *   P3 усечённый файл: записать 2 записи (8 Б) → испортить слоты 0,1,2
 *      → fload вернул 2, слоты 0,1 восстановлены, слот 2 НЕ тронут.
 *   P4 sync: испортить слот 5 палитры 1 → gfx_pal_sync() → слот 5
 *      палитры 1 == слоту 5 палитры 0.
 */
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <graphics.h>
#include <gfx.h>

static uint8_t eq(uint8_t p, uint8_t i, uint8_t r, uint8_t g, uint8_t b)
{
    uint8_t rr, gg, bb;

    gfx_pal_get_color(p, i, &rr, &gg, &bb);
    return rr == r && gg == g && bb == b;
}

static void get3(uint8_t p, uint8_t i, uint8_t *rgb)
{
    gfx_pal_get_color(p, i, rgb, rgb + 1, rgb + 2);
}

int main(void)
{
    uint8_t a[3], c[3], ok;
    int n;

    puts("PALFILE: pal sync/fsave/fload");
    initgraph();

    /* ---- P1: сохранить дефолт ---------------------------------------- */
    ok = (gfx_pal_fsave(0, "pal0.pal") == 0);
    closegraph();
    printf("P1 fsave:  %s\n", ok ? "PASS" : "FAIL");
    if (!ok) return 1;

    initgraph();
    /* ---- P2: полный fload восстанавливает испорченное ----------------- */
    get3(0, 1, a);                       /* эталоны                    */
    get3(0, 200, c);
    gfx_pal_set(0, 1, 63, 0, 63);        /* испортить                  */
    gfx_pal_set(0, 200, 1, 2, 3);
    n = gfx_pal_fload(0, "pal0.pal");
    ok = (n == 256) && eq(0, 1, a[0], a[1], a[2])
                    && eq(0, 200, c[0], c[1], c[2]);
    closegraph();
    printf("P2 fload:  %s (n=%d)\n", ok ? "PASS" : "FAIL", n);

    initgraph();
    /* ---- P3: усечённый файл ------------------------------------------- */
    {
        int fd = creat("pal2.pal", 0);
        uint8_t two[8];
        uint8_t i;

        /* первые 2 записи из pal0.pal */
        for (i = 0; i < 8; i++) two[i] = 0;
        {
            int f0 = open("pal0.pal", O_RDONLY);
            read(f0, two, 8);
            close(f0);
        }
        write(fd, two, 8);
        close(fd);
    }
    get3(0, 0, a);
    get3(0, 1, c);
    gfx_pal_set(0, 0, 63, 63, 0);
    gfx_pal_set(0, 1, 0, 63, 63);
    gfx_pal_set(0, 2, 7, 7, 7);          /* слот 2 портим НАВСЕГДА     */
    n = gfx_pal_fload(0, "pal2.pal");
    ok = (n == 2) && eq(0, 0, a[0], a[1], a[2])
                  && eq(0, 1, c[0], c[1], c[2])
                  && eq(0, 2, 7, 7, 7);  /* не тронут fload'ом         */
    closegraph();
    printf("P3 trunc:  %s (n=%d)\n", ok ? "PASS" : "FAIL", n);

    initgraph();
    /* ---- P4: sync ------------------------------------------------------ */
    get3(0, 5, a);
    gfx_pal_set(1, 5, 1, 1, 1);          /* испортить у страницы 1     */
    gfx_pal_sync();
    ok = eq(1, 5, a[0], a[1], a[2]);
    closegraph();
    printf("P4 sync:   %s\n", ok ? "PASS" : "FAIL");

    puts("done");
    return 0;
}
