#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <pslib.h>
#include <psmodules.h>

#include "ppStack.h"

pmPSF *ppStackPSF(const pmConfig *config, int numCols, int numRows,
                  const psArray *psfs, const psVector *inputMask)
{
    // Get the recipe values
    psMetadata *recipe = psMetadataLookupMetadata(NULL, config->recipes, PPSTACK_RECIPE); // ppStack recipe
    psAssert(recipe, "We've thrown an error on this before.");

    int psfInstances = psMetadataLookupS32(NULL, recipe, "PSF.INSTANCES"); // Number of instances for PSF
    float psfRadius = psMetadataLookupF32(NULL, recipe, "PSF.RADIUS"); // Radius for PSF
    const char *psfModel = psMetadataLookupStr(NULL, recipe, "PSF.MODEL"); // Model for PSF
    int psfOrder = psMetadataLookupS32(NULL, recipe, "PSF.ORDER"); // Spatial order for PSF

    for (int i = 0; i < psfs->n; i++) {
        if (inputMask->data.U8[i]) {
            psFree(psfs->data[i]);
            psfs->data[i] = NULL;
        }
    }

    // Solve for the target PSF
    pmPSF *psf = pmPSFEnvelope(numCols, numRows, psfs, psfInstances, psfRadius, psfModel,
                               psfOrder, psfOrder);
    if (!psf) {
        psError(PS_ERR_UNKNOWN, false, "Unable to determine output PSF.");
        return NULL;
    }

    return psf;
}
