import React from 'react';
import GreyRowBox from '@/components/elements/GreyRowBox';
import ArchiveViewer from './ArchiveViewer';
import DatabaseViewer from './DatabaseViewer';
import NbtEditor from './NbtEditor';
import { FaFileArchive, FaFileCode } from 'react-icons/fa';

interface BinaryFileViewerProps {
    uuid: string;
    filePath: string;
    readOnly?: boolean;
}

export const isViewableArchive = (filePath: string): boolean => {
    const lower = filePath.toLowerCase();
    const ext = lower.split('.').pop();
    return ['zip', 'jar', 'war', 'tar', 'tgz'].includes(ext || '') || lower.endsWith('.tar.gz');
};

export const isNbtFile = (filePath: string): boolean => {
    const ext = filePath.split('.').pop()?.toLowerCase();
    return ['nbt', 'dat'].includes(ext || '');
};

export const isDatabaseFile = (filePath: string): boolean => {
    const ext = filePath.split('.').pop()?.toLowerCase();
    return ['db', 'sqlite', 'sqlite3'].includes(ext || '');
};

const BinaryFileViewer: React.FC<BinaryFileViewerProps> = ({ uuid, filePath, readOnly = false }) => {
    if (isViewableArchive(filePath)) {
        return <ArchiveViewer uuid={uuid} filePath={filePath} readOnly={readOnly} />;
    }

    if (isDatabaseFile(filePath)) {
        return <DatabaseViewer uuid={uuid} filePath={filePath} readOnly={readOnly} />;
    }

    if (isNbtFile(filePath)) {
        return <NbtEditor uuid={uuid} filePath={filePath} readOnly={readOnly} />;
    }

    return (
        <GreyRowBox className={'flex-1 flex flex-col items-center justify-center !p-8 text-center'} $hoverable={false}>
            <FaFileCode className={'mb-4 h-12 w-12 text-neutral-500'} />
            <p className={'text-lg font-medium text-neutral-100'}>Binary file</p>
            <p className={'mt-1 max-w-lg text-sm text-neutral-400'}>
                This file cannot be previewed inline.
            </p>
            <div className={'mt-4 flex items-center text-xs text-neutral-500'}>
                <FaFileArchive className={'mr-2 h-3.5 w-3.5'} />
                Zip, jar, war, tar, tar.gz, tgz, nbt, dat, db, sqlite, and sqlite3 files have enhanced viewers.
            </div>
        </GreyRowBox>
    );
};

export default BinaryFileViewer;
