/* ======================================================
                  Ricardo Martin Manso
                     PFC - UOC 2010
======================================================= */

package backup;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

// =======================================================
// Almacena y gestiona los datos de la cabecera del archivo AD
// =======================================================
public class CabeceraAD {

    private Date fechaCreacion;
    private long codeInicial;
    private int periodoRetencion;
    public List<Backup> backups;

    private int iBackup;

    CabeceraAD()
    {
        backups=new ArrayList<Backup>();
        codeInicial=1;
        fechaCreacion= new Date();
    }

    public void addBackup(Backup b)
    {
        backups.add(b);
        iBackup=backups.size()-1;
    }

    public void setBackup(int i)
    {
        iBackup=i;
    }

    public Backup findBackup(int code) throws ADException
    {
        if (backups.size()==0) throw new ADException(ADException.ADE_CODEBK,""+code);

        if (code==0)
        {
            iBackup=backups.size()-1;
            return backups.get(iBackup);
        }

        code=code-(int)codeInicial;
        if (code>=0 && code<backups.size())
        {
            iBackup=code;
            return backups.get(iBackup);
        }
        else
            return null;
    }

    public Backup getBackup()
    {
        return backups.get(iBackup);
    }

    public String getNombreBackup()
    {
        return "BACKUP"+(iBackup+codeInicial);
    }

    public Backup getLastBackup()
    {
        if (backups.size()>0) return backups.get(backups.size()-1); else return null;
    }

    public void write(RandomAccessFile fich) throws IOException
    {
        int i;
        int nBackups=backups.size();
        fich.seek(0);
        fich.writeLong(codeInicial);
        fich.writeInt(periodoRetencion);
        fich.writeLong(fechaCreacion.getTime());
        fich.writeInt(nBackups);
        for(i=0;i<nBackups;i++) backups.get(i).write(fich);
    }

    public void read(RandomAccessFile fich) throws IOException, ParseException
    {
        int i;
        int nBackups;
        fich.seek(0);
        codeInicial=fich.readLong();
        periodoRetencion=fich.readInt();
        fechaCreacion.setTime(fich.readLong());
        nBackups=fich.readInt();
        for(i=0;i<nBackups;i++)
        {
            Backup b=new Backup();
            b.read(fich);
            backups.add(b);
        }
        iBackup=i-1;
    }

    public void print()
    {
        int i;
        System.out.println("Fecha creacion:"+getStrFechaCreacion()+" Caducado:["+isCaducado()+"]");
        System.out.println("Periodo de Retencion:"+periodoRetencion+" dias");
        System.out.println("Backups:");
        for(i=0;i<backups.size();i++)
        {
            System.out.format("%5d  ", codeInicial+i);
            backups.get(i).print();
        }
    }



    /**
     * @return the codeInicial
     */
    public long getCodeInicial() {
        return codeInicial;
    }

    /**
     * @param codeInicial the codeInicial to set
     */
    public void setCodeInicial(long codeInicial) {
        this.codeInicial = codeInicial;
    }

    /**
     * @return the periodoRetencion
     */
    public int getPeriodoRetencion() {
        return periodoRetencion;
    }

    /**
     * @param periodoRetencion the periodoRetencion to set
     */
    public void setPeriodoRetencion(int periodoRetencion) {
        this.periodoRetencion = periodoRetencion;
    }

  
    public Date getFechaCreacion() {
        return fechaCreacion;
    }

    public void setFechaCreacion(Date fechaCreacion) {
        this.fechaCreacion = fechaCreacion;
    }

    public String getStrFechaCreacion()
    {
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yy HH:mm");
        return formato.format(fechaCreacion);
    }

    public boolean isCaducado()
    {
        long periodo=(new Date()).getTime()-fechaCreacion.getTime();
        periodo/=1000*60*60*24;
        return (periodo>periodoRetencion);
    }

    public boolean isVacio()
    {
        return (backups.size()==0);
    }

}
