/*
 * RowInfoMatcher.java
 *
 * Created on May 25, 2006, 12:52 PM
 *
 */
package usda.weru.util.diff.listbuilders;

import de.schlichtherle.truezip.file.TFile;
import usda.weru.util.diff.*;

/**
 *
 * @author Joseph Levin
 */
public class FileListBuilder extends ObjectListBuilder {

    String c_name;

    /**
     *
     */
    public FileListBuilder() {
        this("File");
    }

    /**
     *
     * @param name
     */
    public FileListBuilder(String name) {
        c_name = name;
    }

    /**
     *
     * @param engine
     * @param a
     * @param b
     * @return
     * @throws IncomparableObjectsException
     */
    @Override
    public DiffNode buildList(DiffEngine engine, Object a, Object b) throws IncomparableObjectsException {
        test(TFile.class, a, b);
        return applyExtras(buildList(engine, (TFile) a, (TFile) b));
    }

    /**
     *
     * @param engine
     * @param fileA
     * @param fileB
     * @return
     */
    public DiffNode buildList(DiffEngine engine, TFile fileA, TFile fileB) {
        DiffNode node = new DiffNode(c_name, fileA, fileB);

        if (fileA == null || fileB == null) {
            if (fileA != null) {
                node.setA(fileA.getName());
            }
            if (fileB != null) {
                node.setB(fileB.getName());
            }
            return node;
        }

        if (fileA.isDirectory() && fileB.isDirectory()) {
            return buildDirectoryList(fileA, fileB);
        }

        return buildFileList(fileA, fileB);
    }

    private DiffNode buildFileList(TFile fileA, TFile fileB) {
        DiffNode node = new DiffNode(c_name, fileA, fileB);
        node.setA(fileA.getName());
        node.setB(fileB.getName());

        //node.addChild("Length", fileA.length(), fileB.length());
        //node.addChild("Last Modified", new Date(fileA.lastModified()), new Date(fileB.lastModified()));
        return node;
    }

    private DiffNode buildDirectoryList(TFile dirA, TFile dirB) {
        DiffNode node = new DiffNode("File Directory", dirA, dirB);

        if (dirA != null) {
            node.setA(dirA.getName() + TFile.separator);
        }
        if (dirB != null) {
            node.setB(dirB.getName() + TFile.separator);
        }

        java.io.File[] filesA = dirA.listFiles();
        java.io.File[] filesB = dirB.listFiles();

        Object[][] listA = new Object[filesA.length][2];
        for (int i = 0; i < filesA.length; i++) {
            listA[i][0] = filesA[i];
            listA[i][1] = filesA[i].getName();
        }

        Object[][] listB = new Object[filesB.length][2];
        for (int i = 0; i < filesB.length; i++) {
            listB[i][0] = filesB[i];
            listB[i][1] = filesB[i].getName();
        }

        Object[] matches = match(listA, listB, false, true);

        for (Object o : matches) {
            Object[] match = (Object[]) o;
            node.queueChild(match[0], match[1]);
        }
        return node;
    }

}
