import type { ProDOSVolume } from '.';
import { ProDOSFile } from './base_file';
import { BitMap } from './bit_map';
import { STORAGE_TYPES } from './constants';
import { FileEntry } from './file_entry';

export class SeedlingFile extends ProDOSFile {
    blocks: Uint8Array[];
    bitMap: BitMap;

    constructor(volume: ProDOSVolume, private fileEntry: FileEntry) {
        super(volume);
        this.blocks = volume.blocks();
        this.bitMap = volume.bitMap();
    }

    getBlockPointers() {
        const pointers = [this.fileEntry.keyPointer];
        return pointers;
    }

    read() {
        const seedlingBlock = this.blocks[this.fileEntry.keyPointer];
        const data = new Uint8Array(this.fileEntry.eof);
        data.set(seedlingBlock.slice(0, this.fileEntry.eof));
        return data;
    }

    write(data: Uint8Array) {
        if (this.fileEntry.keyPointer) {
            this.delete();
        }
        this.fileEntry.storageType = STORAGE_TYPES.SEEDLING;
        this.fileEntry.keyPointer = this.bitMap.allocBlock();
        this.fileEntry.eof = data.byteLength;
        const seedlingBlock = this.blocks[this.fileEntry.keyPointer];
        seedlingBlock.set(data);
        this.fileEntry.write();
    }

    delete() {
        const pointers = this.getBlockPointers();
        for (let idx = 0; idx < pointers.length; idx++) {
            this.bitMap.freeBlock(pointers[idx]);
        }
    }
}

