package fi.lpam.tulostajat;

import fi.lpam.dataluokat.Kuljetus;
import fi.lpam.gui.virheDialogit.SiirtoVirhe;
import javafx.collections.ObservableList;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.printing.PDFPageable;

import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.IOException;
import java.time.format.DateTimeFormatter;

@SuppressWarnings("DuplicatedCode")
public class KuljetusListaTulostaja extends Tulostaja{
    public static void tulosta(ObservableList<Kuljetus> kuljetukset, int kierrosnumero) {
        int kuljetuksetPerSivu = 17;
        try (PDDocument dokumentti = new PDDocument()) {
            PDPage sivu = new PDPage();
            dokumentti.addPage(sivu);
            PDPageContentStream sisältö = new PDPageContentStream(dokumentti, sivu);
            sisältö.beginText();


            sisältö.setFont(fontti, fonttiKoko);
            sisältö.setLeading(leading);
            sisältö.newLineAtOffset(25, 750);
            sisältö.showText(kuljetukset.getFirst().getKuljetusPäivämäärä().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + ", kierros " + kierrosnumero);
            sisältö.newLineAtOffset(0, -25);

            int riviLaskuri = 1;
            for (Kuljetus kuljetus : kuljetukset) {
                //Tyhjää kuljetusta ei tulosteta
                if ((kuljetus.getSalaatit() + kuljetus.getPääruoat() + kuljetus.getJälkiruoat()) < 1) {continue;}

                if (riviLaskuri > kuljetuksetPerSivu) {
                    sisältö.endText();
                    sisältö.close();
                    PDPage uusiSivu = new PDPage();
                    dokumentti.addPage(uusiSivu);
                    sisältö =  new PDPageContentStream(dokumentti, uusiSivu);
                    sisältö.beginText();
                    sisältö.setFont(fontti, fonttiKoko);
                    sisältö.setLeading(leading);
                    sisältö.newLineAtOffset(25,750);
                    riviLaskuri = 0;
                }
                //Ensimmäinen rivi
                sisältö.showText(kuljetus.getNimi());
                int sarake1 = 150;
                sisältö.newLineAtOffset(sarake1, 0);
                sisältö.showText(kuljetus.getOsoite());
                int sarake2 = 230;
                sisältö.newLineAtOffset(sarake2, 0);
                sisältö.showText(kuljetus.getAvainTieto());

                //Toinen rivi
                sisältö.newLineAtOffset(-sarake1-sarake2, -15);
                sisältö.showText("Sal: " + kuljetus.getSalaatit()
                        + "   Pr: " + kuljetus.getPääruoat()
                        +  "   Jr: " + kuljetus.getJälkiruoat());
                sisältö.newLineAtOffset(sarake1, 0);
                sisältö.showText(kuljetus.getRuokarajoite());
                sisältö.newLineAtOffset(sarake2, 0);
                sisältö.showText(kuljetus.getLisätieto());

                sisältö.newLineAtOffset(-sarake1-sarake2, -5);
                sisältö.showText("________________________________________________________________________________");
                sisältö.newLineAtOffset(0, -20);

                riviLaskuri++;
            }
            sisältö.endText();
            sisältö.close();

            PrinterJob tuloste = PrinterJob.getPrinterJob();
            tuloste.setPageable(new PDFPageable(dokumentti));
            if (tuloste.printDialog()) {
                tuloste.print();

            }
        } catch (IOException | PrinterException e) {
            SiirtoVirhe virhe = new SiirtoVirhe(e);
            virhe.showAndWait();
        }
    }
}