package fi.lpam.dataluokat;

import fi.lpam.gui.virheDialogit.SiirtoVirhe;

import java.sql.*;
import java.time.LocalDate;
import java.util.ArrayList;

@SuppressWarnings("ClassCanBeRecord")
public class RaporttiRivi {
    private final String nimi;
    private final LocalDate alkuPvm, loppuPvm;
    private final int salaatit, pääruoat, jälkiruoat;
    private final String lisätiedot;

    public RaporttiRivi(String nimi, LocalDate alkuPvm, LocalDate loppuPvm, int salaatit, int pääruoat, int jälkiruoat, String lisätiedot) {
        this.nimi = nimi;
        this.alkuPvm = alkuPvm;
        this.loppuPvm = loppuPvm;
        this.salaatit = salaatit;
        this.pääruoat = pääruoat;
        this.jälkiruoat = jälkiruoat;
        this.lisätiedot = lisätiedot;
    }

    public static ArrayList<RaporttiRivi> haeRaportti(LocalDate alkuPvm, LocalDate loppuPvm, boolean tarkka) {
        ArrayList<RaporttiRivi> raportti = new ArrayList<>();
        try (Connection tietokanta = Tietokanta.haeYhteys()) {
            ResultSet rs;
            if (tarkka) {
                //Jokainen kuljetus saa oman rivin
                PreparedStatement stmt = tietokanta.prepareStatement("select nimi, kuljetusPäivämäärä, salaatit, pääruoat, jälkiruoat, lisätieto from kuljetukset where kuljetusPäivämäärä between ? and ? order by nimi");
                stmt.setDate(1, Date.valueOf(alkuPvm));
                stmt.setDate(2, Date.valueOf(loppuPvm));
                rs = stmt.executeQuery();

                while (rs.next()) {
                    RaporttiRivi uusi = new RaporttiRivi(
                            rs.getString(1),
                            rs.getDate(2).toLocalDate(),
                            rs.getDate(2).toLocalDate(),
                            rs.getInt(3),
                            rs.getInt(4),
                            rs.getInt(5),
                            rs.getString(6)
                    );
                    raportti.add(uusi);
                }

            } else {
                //Kuljetukset summataan yhteen riviin per vastaanottaja
                PreparedStatement stmt = tietokanta.prepareStatement("select nimi, kuljetusPäivämäärä, sum(salaatit), sum(pääruoat), sum(jälkiruoat), group_concat(lisätieto, '\n') from kuljetukset where kuljetusPäivämäärä between ? and ? group by nimi order by nimi;");
                stmt.setDate(1, Date.valueOf(alkuPvm));
                stmt.setDate(2, Date.valueOf(loppuPvm));
                rs = stmt.executeQuery();

                while (rs.next()) {
                    RaporttiRivi uusi = new RaporttiRivi(
                            rs.getString(1),
                            alkuPvm,
                            loppuPvm,
                            rs.getInt(3),
                            rs.getInt(4),
                            rs.getInt(5),
                            rs.getString(6)
                    );
                    raportti.add(uusi);
                }
            }
        } catch (SQLException e) {
            SiirtoVirhe virhe = new SiirtoVirhe(e);
            virhe.showAndWait();
            return null;
        }
        return raportti;
    }
    @Override
    public String toString() {
        return this.nimi + ":\nSal: " + this.salaatit + ", Pr: " + this.pääruoat + ", Jr: " + this.jälkiruoat + "\nLisätiedot:\n" + this.lisätiedot;
    }

    public String getNimi() {
        return nimi;
    }

    public LocalDate getAlkuPvm() {
        return alkuPvm;
    }

    public LocalDate getLoppuPvm() {
        return loppuPvm;
    }

    public int getSalaatit() {
        return salaatit;
    }

    public int getPääruoat() {
        return pääruoat;
    }

    public int getJälkiruoat() {
        return jälkiruoat;
    }

    public String getLisätiedot() {
        return lisätiedot;
    }
}