const AnimeRepository = require('../database/AnimeRepository');
const SegregatedRepository = require('../database/SegregatedRepository');
const imm = require('../image');
const path = require('path');
const fs = require('fs');

//Aktualizacja lub kasowanie przypisania anime do danej grupy
async function SergregateUpdate(userId, updateData) {
    if(updateData.group != 0) {
        const result = await SegregatedRepository.Edit(updateData.group, updateData.id, userId);
        if(result === 0) {
            await SegregatedRepository.Add(updateData.id, updateData.group, userId);
        }
    }
    else {
        await SegregatedRepository.DeleteByAnime(updateData.id, userId);
    }
}

//Aktualizacja obrazka
async function PosterUpdater(updateData, imgPaths) {
    let updateImage = false;
    let poster = null;
    let miniature = null;

    if(updateData.newImage && !updateData.removeImage) {
        const posterPath = imgPaths?.poster !== undefined ? imgPaths.poster : null;
        const miniaturePath = imgPaths?.miniature !== undefined ? imgPaths.miniature : null;

        poster = await imm.LoadImgToBlob(posterPath);
        miniature = await imm.LoadImgToBlob(miniaturePath);
        updateImage = true;
    }

    if(updateData.removeImage && !updateData.newImage) {
        updateImage = true;
    }

    return {
        update: updateImage,
        poster: poster,
        miniature: miniature
    };
}

//Aktualizacja opisu
async function DescriptionUpdate(dsdata) {
    if (dsdata.description || dsdata.poster) {
        if (await AnimeRepository.EditDescription(dsdata) < 1) {
            await AnimeRepository.AddDescription(dsdata);
        }
    }
    else {
        await AnimeRepository.DeleteDescription(dsdata.anie);
    }
}

async function EditAnimeRecord(req, res) {
    try {
        if(!req.session.isLogged) {
            console.error('ERROR: Edit anime record request. Użytkownik nie jest zalogowany');
            return res.status(401).json({
                mess: 'Użytkownik nie jest zalogowany',
                complete: false
            });
        }

        if(!req.body) {
            console.error('ERROR: Edit anime record request. Użytkownik nie jest zalogowany');
            return res.status(401).json({
                mess: 'Użytkownik nie jest zalogowany',
                complete: false
            }); 
        }

        const updateData = req.body;
        const userHash = req.session.user_hash;
        const imgPaths = req.session.img_files;
        const userId = req.session.user_id;
        
        //Aktualizacja obrazu
        const image = await PosterUpdater(updateData, imgPaths);

        // Dane do aktualizacji tabeli anm_animes
        const data = {
            id: updateData.id,
            user: userId,
            title: updateData.title,
            url: updateData.url,
            episodes: updateData.episodes,
            miniature: image.miniature,
            updateMiniature: image.update
        };

        // Dane do aktualizacji tabeli anm_descriptions
        const dsdata = {
            anime: updateData.id,
            description: updateData.description,
            poster: image.poster,
            posterUpdate: image.update
        };

        //Aktualizuj rekord
        await AnimeRepository.Update(data);

        //Aktualizacja lub kasowanie przypisania anime do danej grupy
        await SergregateUpdate(userId, updateData);

        //Aktualizacja rekordu descryption
        await DescriptionUpdate(dsdata);


        const uploadDirectory = path.join(__dirname, '../../upload', userHash);
        if(fs.existsSync(uploadDirectory)) {
            fs.rmSync(uploadDirectory, { recursive: true });
        }

        res.status(200).json({
            mess: 'Rekord został zaktualizowany',
            complete: true
        });
    }
    catch(e) {
        console.error(`ERROR: Nie udało się zaktualizować recordu: ${e}`);
        res.status(500).json({
            mess: 'Nie udało się zaktualizować rekordu',
            complete: false
        });
    }
}

module.exports = EditAnimeRecord;