package vut.msa.helpers;

import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import vut.msa.pojos.BackupDisk;

/**
 * Helper pre triedy BackupDisk
 */
public class BackupDiskHelper extends Helper {

    private static final Logger llog = Logger.getLogger(BackupDiskHelper.class);

    /**
     * Metoda vytvori zaznam v databaze. Ulozi zaznam o disku, ktory sa pouziva
     * pre zalohovanie. Sluzi na previazanie s klientami.
     *
     * @param disk novy disk, urceny pre zalohovanie
     */
    public void addBackupDisk(BackupDisk disk) {

        try {
            openSession();

            //Jedna sa o transietny objekt, preto treba volat persist
            session.persist(disk);
            llog.info("Ulozenie disku pre zalohovanie do databazy bolo uspesne.");
            
            endTransaction(session.getTransaction(), true);
        } catch (Exception lex) {
            llog.error(lex.getMessage());
        }
    }

    /**
     * Metoda zmaze zaznam z databazy, kde su ulozene disky pre zalohovanie.
     *
     * @param disk disk, ktory ma byt zmazany z databazy
     */
    public void removeBackupDisk(BackupDisk disk) {
        try {
            openSession();

            String repairString = disk.getDiskName().replace("\\", "\\\\");
            Query q =
                    session.createQuery("from BackupDisk b where"
                    + " b.diskName='" + repairString + "'");
            disk = (BackupDisk) q.uniqueResult();

            session.delete(disk);

            //TODO: v tabulke clients treba zmenit miesto zalohy po prekopirovani
            
            llog.info("Zmazanie disku pre zalohovanie do databazy bolo uspesne.");

            endTransaction(session.getTransaction(), true);
        } catch (Exception lex) {
            llog.error(lex.getMessage());
        }
    }

    /**
     * Metoda vrati zoznam diskov, ktore sluzia pre zalohovanie.
     *
     * @return zoznam diskov pre zalohovanie
     */
    public List<BackupDisk> getBackupDisksList() {

        List<BackupDisk> disks = new ArrayList<BackupDisk>();
        try {
            openSession();

             Query q =
                    session.createQuery("from BackupDisk order by diskName");

            disks = q.list();

            for (BackupDisk bd : disks) {
                session.load(BackupDisk.class, bd.getDiskName());
            }
            endTransaction(session.getTransaction(), false);
        } catch (Exception lex) {
            llog.error(lex.getMessage());
        }

        return disks;
    }
}
