import { DownloadStatus, useAttachment } from "@/app/providers/AttachmentProvider/useAttachment";
import { AttachmentProps } from "./MessageAttachments";
import { useRosettaColors } from "@/app/hooks/useRosettaColors";
import { Avatar, Box, Flex, Loader, Text } from "@mantine/core";
import { IconArrowDown, IconFile, IconX } from "@tabler/icons-react";
import { dotCenterIfNeeded, humanFilesize } from "@/app/utils/utils";
import { AnimatedRoundedProgress } from "../AnimatedRoundedProgress/AnimatedRoundedProgress";
import { DeliveredMessageState } from "@/app/providers/DialogProvider/DialogProvider";
import { useCore } from "@/app/hooks/useCore";

export function MessageFile(props : AttachmentProps) {
    const colors = useRosettaColors();
    const {
        downloadPercentage, 
        downloadStatus, 
        uploadedPercentage, 
        download, 
        getPreview,
        } = 
        useAttachment(
            props.attachment, 
            props.parent, 
        );
    const preview = getPreview();
    const error = downloadStatus == DownloadStatus.ERROR;
    const filesize = parseInt(preview.split("::")[0]);
    const filename = preview.split("::")[1];
    const filetype = filename.split(".")[filename.split(".").length - 1];
    const isEncrypting = props.delivered == DeliveredMessageState.WAITING && uploadedPercentage <= 0;
    const isUploading = props.delivered == DeliveredMessageState.WAITING && uploadedPercentage > 0 && uploadedPercentage < 100;
    const {getDownloadsPath} = useCore();

    const onClick = async () => {
        if(downloadStatus == DownloadStatus.ERROR){
            return;
        }
        if(downloadStatus == DownloadStatus.DOWNLOADED){
            const downloadsPath = await getDownloadsPath();
            let pathInDownloads = downloadsPath + "/Rosetta Downloads/" + filename;
            //await writeFile(pathInDownloads, buffer, false);
            window.shell.showItemInFolder(pathInDownloads);
            return;
        }
        if(downloadStatus == DownloadStatus.NOT_DOWNLOADED){
            download();
            return;
        }
    }

    return (
        <Box p={'sm'} onClick={onClick} style={{
            background: colors.mainColor,
            border: '1px solid ' + colors.borderColor,
            borderRadius: 8,
            minWidth: 200,
            minHeight: 60
        }}>
            <Flex gap={'sm'} direction={'row'}>
                <Avatar bg={error ? colors.error : colors.brandColor} size={40}>
                    {!error && <>
                        {(downloadStatus == DownloadStatus.DOWNLOADING && downloadPercentage > 0 && downloadPercentage < 100) && (
                            <div style={{
                                position: 'absolute',
                                top: 0,
                                left: 0,
                            }}>
                                <AnimatedRoundedProgress size={40} value={downloadPercentage}></AnimatedRoundedProgress>
                            </div>
                        )}
                        {downloadStatus != DownloadStatus.DOWNLOADED && (
                            <IconArrowDown color={'white'} size={22}></IconArrowDown>
                        )}
                        {isUploading && (
                            <div style={{
                                position: 'absolute',
                                top: 0,
                                left: 0,
                            }}>
                                <AnimatedRoundedProgress size={40} value={uploadedPercentage}></AnimatedRoundedProgress>
                            </div>
                        )}
                        {downloadStatus == DownloadStatus.DOWNLOADED && <IconFile color={'white'}  size={22}></IconFile>}
                    </>}
                    {error && <>
                       <IconX color={'white'} size={22}></IconX> 
                    </>}
                </Avatar>
                <Flex direction={'column'} gap={5}>
                    <Text size={'sm'}>{dotCenterIfNeeded(filename, 25, 8)}</Text>
                    {!error && !isEncrypting && !isUploading && (downloadStatus == DownloadStatus.DOWNLOADED || downloadStatus == DownloadStatus.NOT_DOWNLOADED) && 
                        <Text size={'xs'} c={colors.chevrons.active}>
                            {humanFilesize(filesize)} {filetype.toUpperCase()}
                        </Text>
                    }
                    {downloadStatus == DownloadStatus.DOWNLOADING &&
                        <Flex gap={5} align={'center'}>
                            <Loader size={10}></Loader>
                            <Text size={'xs'} c={colors.chevrons.active}>
                                Downloading... {downloadPercentage}%
                            </Text>
                        </Flex>                        
                    }
                    {isEncrypting && 
                        <Flex gap={5} align={'center'}>
                            <Loader size={10}></Loader>
                            <Text size={'xs'} c={colors.chevrons.active}>
                                Encrypting...
                            </Text>
                        </Flex>
                    }
                    {isUploading &&
                        <Flex gap={5} align={'center'}>
                            <Loader size={10}></Loader>
                            <Text size={'xs'} c={colors.chevrons.active}>
                                Uploading... {uploadedPercentage}%
                            </Text>
                        </Flex>                      
                    }
                    {downloadStatus == DownloadStatus.DECRYPTING && 
                        <Flex gap={5} align={'center'}>
                            <Loader size={10}></Loader>
                            <Text size={'xs'} c={colors.chevrons.active}>
                                Decrypting...
                            </Text>
                        </Flex>
                    }
                    {error && <Text size={'xs'} c={colors.error}>
                        File expired
                    </Text>}
                </Flex>
            </Flex>
        </Box>
    )
}