#ifndef DAUBECHIES_H
#define DAUBECHIES_H

class Daubechies {

  public:

    static char TheP;
    static char diese;
    static int type;
    static int dimX;
    static int maxIntensity;
    static std::string line_of_comments;

    static double **v;
    static double **workAAA;
    static double **workBBB;
    static double  *workCCC;
    static double  *h;
    static double  *g;
    static int max_iter;

    void Do_Discrete_Matrix_Transformation(char File_in[], char File_out[], int Total_Iterations, int Dorder);
    void Do_Inverse_Matrix_Transformation(char File_in[], char File_out[], int Total_Iterations, int Dorder);

    void DWT2D(int Dorder);
    void DWT2D1(double **A, double **C, int dim_matrix, int Dorder);
    void LeftDWT(double **A, double **R, int dim_matrix, int Dorder);
    void DWT1D1(double *v, double *y, int N, int L);

    void IDWT2D(int Dorder);
    void IDWT2D1(double **workAAA, double **workBBB, int dim_matrix, int Dorder);
    void LeftIDWT(double **workAAA, double **workBBB, int dim_matrix, int Dorder);
    void IDWT1D1(double *v, double *y, int N, int L);
    void IDWTht(double *signal, double *InverseTransform, double *filter, int n, int Dorder);

    void AssignCoefficients(int Dorder);
    void VerifyMaxIterations(int Total_Iterations);
    void AllocateWork(int dim_matrix);
    void DeallocateWork(int dim_matrix);
    void GetCorner(double **workAAA, int dim_matrix);
    void PutCorner(double **workBBB, int dim_matrix);
    void TransposeMatrix(double **A, int dim_matrix);
    void CopyMatrix(double **A, double **B, int dim_matrix);
    void CopyVector(double *A, double *B, int dim_vector);
    void ReadMatrix(char File_in[]);
    void Write_Matrix_as_PGM(char File_out[]);
    void Write_Transform_as_PGM(char File_out[]);
    void WriteMatrix(char File_out[]);
    void Entropy();
    void CumulativeEnergy(char cumul[]);
    void Postprocess();
    void PrintMatrixDEBUG(std::string message, double **matrix, int dim_matrix);
    void PrintVectorDEBUG(std::string message, double *vector, int dim_vector);

    void quickSort(double *numbers, int array_size);
    void q_sort(double *numbers, int left, int right);

    void AlterTransform(double threshold, int type);
};
#endif

