
const fs = require('fs');
const util = require('util');
const test = require('ava');
const readVox = require('vox-reader');
const writeVox = require('../index');
const { diff } = require("json-diff")
const { omit, flatten } = require("ramda");
const { range} = require("lodash")


test('test extended.vox', (t : any) => 
{
    const buffer = fs.readFileSync('./test/deer.vox')
    const parsedBuffer = readVox(buffer);
    const vox = omit(
        Object.entries(parsedBuffer)
            .filter(([_key, value]) => Object.keys((value as Object)).length === 0)
            .map(([key, _value]) => key),
        parsedBuffer);
    console.log(util.inspect(vox, false, null, true))
    const writtenVox = writeVox(vox)
    const validationVox = readVox(writtenVox)
    t.assert(diff(vox, validationVox) === undefined, "vox-reader and vox-writer should be the same (handling extended files)");
    
    t.pass();
});

test('generate sphere', (t : any) => 
{   
    const SIZE = 20;
    const RADIUS = 8;

    const checkIfInsideSphere = (x : number, y : number, z : number) => {

        const cx = x - SIZE / 2;
        const cy = y - SIZE / 2;
        const cz = z - SIZE / 2;

        return cx * cx + cy * cy + cz * cz < RADIUS * RADIUS;
    }

    const xyziValues = 
        flatten(range(0, SIZE).map((z : number) => 
            range(0, SIZE).map((y : number) => 
                range(0, SIZE).map((x : number) => 
                    ({ x, y, z, i: checkIfInsideSphere(x, y, z) ? 1 : 0 })
                )
            )
        ))
        .filter((v : any) => checkIfInsideSphere(v.x, v.y, v.z))
    

    const vox = {
        size: { x: SIZE, y: SIZE, z: SIZE },
        xyzi: {
            numVoxels: xyziValues.length,
            values: xyziValues
        },
        rgba: {
            values: [
                ...range(0, 255).map(() => ({r: 255, g: 255, b: 255, a: 255})),
            ]
        }
    }

    const writtenVox = writeVox(vox)
    fs.writeFileSync('./test/sphere.vox', Buffer.from(writtenVox))

    t.pass();
});