/*
 * NotePrinter.java
 *
 * Created on December 30, 2005, 2:59 PM
 *
 */
package ex1;

import de.schlichtherle.truezip.file.TFile;
import de.schlichtherle.truezip.file.TFileOutputStream;
import java.awt.*;
import java.awt.print.*;
import java.io.IOException;
import java.io.PrintStream;
import java.io.RandomAccessFile;
import java.util.*;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 *
 * @author maxerdwien
 */
public class NotePrinter implements Printable {

    private static final Logger LOGGER = LogManager.getLogger(NotePrinter.class);

    private RandomAccessFile raf;
    private final Font fnt = new Font("Courier", Font.PLAIN, 10);
    private int rememberedPageIndex = -1;
    private long rememberedFilePointer = -1;
    private boolean rememberedEOF = false;
    private String c_typeOfNotes = "";
    private String c_fileName = "";

    /**
     *
     * @param typeOfNotes
     * @param fileName
     */
    public NotePrinter(String typeOfNotes, String fileName) {
        c_typeOfNotes = typeOfNotes;
        c_fileName = fileName;
    }

    /**
     *
     * @param notes
     */
    public void printNotes(String notes) {
        try {
            TFile tempNotesFile = null;

            tempNotesFile = new TFile(TFile.createTempFile("notes", "temp"));
            TFileOutputStream out = new TFileOutputStream(tempNotesFile);
            try (PrintStream p = new PrintStream(out)) {
                p.println(notes);
            }

            // Opening the notes file in the current runDirectory
            raf = new RandomAccessFile(tempNotesFile, "r");
            // Get a PrinterJob
            PrinterJob job = PrinterJob.getPrinterJob();
            // Ask user for page format (e.g., portrait/landscape)
            //PageFormat pf = job.pageDialog(job.defaultPage());
            PageFormat pf = job.defaultPage();
            // Specify the Printable is an instance of
            // PrintListingPainter; also provide given PageFormat
            job.setPrintable(this, pf);
            // Print 1 copy
            job.setCopies(1);
            // Put up the dialog box
            if (job.printDialog()) {
                // Print the job if the user didn't cancel printing
                try {
                    job.print();
                    if (tempNotesFile != null) {
                        tempNotesFile.rm();
                    }
                } catch (PrinterException | IOException e) {
                    /* handle exception */
                }
            }
        } catch (IOException ex) {
            LOGGER.log(Level.ERROR, ex.getMessage());
            rememberedEOF = true;
        }

    }

    /**
     *
     * @param g
     * @param pf
     * @param pageIndex
     * @return
     * @throws PrinterException
     */
    @Override
    public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
        try {
            int pageNum = pageIndex + 1;

            if (pageIndex != rememberedPageIndex) {
                // First time we've visited this page
                rememberedPageIndex = pageIndex;

                // If encountered EOF on previous page, done
                if (rememberedEOF) {
                    return Printable.NO_SUCH_PAGE;
                }
                // Save current position in input file
                rememberedFilePointer = raf.getFilePointer();
            } else {
                raf.seek(rememberedFilePointer);
            }
            // //System.out.println("The co-od:"+g.getClipBounds());
            g.setColor(Color.black);
            g.setFont(fnt);
            int x = (int) pf.getImageableX() + 10;
            int y = (int) pf.getImageableY() + 12;

            // Generate as many lines as will fit in imageable area
            y += 36;
            g.drawString("WEPS DB Viewer", 250, 84);
            g.drawString(c_typeOfNotes + ": " + c_fileName, 82, 96);

            double pageWidth = pf.getImageableWidth() - 15;
            while (y + 12 < (pf.getImageableY() + pf.getImageableHeight() - 24)) {
                String line = raf.readLine();
                if (line == null) {
                    rememberedEOF = true;
                    break;
                }
                int lineWidth = g.getFontMetrics().stringWidth(line);

                if (lineWidth > pageWidth) {
                    //Wrap the lines
                    String growingString = "";
                    String thisToken = "";
                    String lastToken = "";
                    StringTokenizer st = new StringTokenizer(line, " ");
                    while (st.hasMoreTokens()) {
                        while (st.hasMoreTokens() && g.getFontMetrics().stringWidth(
                                growingString + " " + lastToken) <= pageWidth) {
                            thisToken = st.nextToken();
                            if (growingString.length() > 0) {
                                growingString = growingString + " " + lastToken;
                            } else {
                                growingString = lastToken;
                            }
                            lastToken = thisToken;
                        }
                        if (!st.hasMoreTokens()) {
                            growingString = growingString + " " + lastToken;
                        }
                        g.drawString(growingString, x, y);
                        y += 12;
                        growingString = "";
                        thisToken = "";
                    }

                } else {

                    g.drawString(line, x, y);
                    y += 12;
                }

            }

            g.drawString("Page:" + pageNum, 82, 708);
            g.drawString("Date Printed:" + new Date().toString(), 82, 720);

            return Printable.PAGE_EXISTS;
        } catch (java.io.IOException e) {
            return Printable.NO_SUCH_PAGE;
        }
    }
}
