package net.sevecek.dailyplanet;

import java.sql.*;
import java.util.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.dao.*;
import org.springframework.jdbc.core.*;
import org.springframework.stereotype.*;

@Repository
public class ClanekRepository {

    @Autowired
    private JdbcTemplate pokladacDotazu;

    @Autowired
    private RowMapper<Clanek> prevodnikTridyClanek;

    public List<Clanek> findAll() {
        List<Clanek> seznamClanku = pokladacDotazu.query(
                "SELECT clanek.Clanek_ID, clanek.Nazev, clanek.Cislo_revize as cisloRevize, Autor.Autor_ID as id, Autor.KrestniJmeno, Autor.Prijmeni, Autor.Email, Autor.Telefon "
                + "    FROM clanek LEFT OUTER JOIN autor "
                + "    ON clanek.Autor_ID = autor.Autor_ID",
                prevodnikTridyClanek);
        return seznamClanku;
    }

    public Clanek findById(UUID id) throws EmptyResultDataAccessException {
        Clanek jedenClanek = pokladacDotazu.queryForObject(
                "SELECT clanek.Clanek_ID, clanek.Nazev, clanek.Cislo_revize as cisloRevize, Autor.Autor_ID as id, Autor.KrestniJmeno, Autor.Prijmeni, Autor.Email, Autor.Telefon "
                + "    FROM clanek LEFT OUTER JOIN autor "
                + "    ON clanek.Autor_ID = autor.Autor_ID "
                + "    WHERE clanek.Clanek_ID = ?",
                prevodnikTridyClanek,
                id.toString());
        if (jedenClanek == null) {
            throw new EmptyResultDataAccessException("Clanek " + id + " nebyl nalezen", 1);
        }
        return jedenClanek;
    }

    public Clanek update(Clanek zaznamKUlozeni) throws OptimisticLockingFailureException {
        int pocetZmenenychZaznamu = pokladacDotazu.update(
                "UPDATE clanek SET Nazev = ?, Autor_ID = ?, Cislo_revize = Cislo_revize + 1 "
                        + "    WHERE Clanek_ID = ? AND Cislo_revize = ?",
                zaznamKUlozeni.getNazev(),
                zaznamKUlozeni.getAutor().getId().toString(),
                zaznamKUlozeni.getId().toString(),
                zaznamKUlozeni.getCisloRevize());
        if (pocetZmenenychZaznamu < 1) {
            throw new OptimisticLockingFailureException("Clanek byl soubezne zmenen jinym uzivatelem. Vase zmeny nelze ulozit, aby neprepsaly soubezne zmeny jineho uzivatele");
        }
        return zaznamKUlozeni;
    }

    public void remove(UUID id) {
        pokladacDotazu.update(
                "DELETE FROM clanek WHERE Clanek_ID = ?",
                id.toString());
    }

    public Clanek insert(Clanek zaznamKPridani) {
        pokladacDotazu.update(
                "INSERT INTO clanek (Clanek_ID, Nazev, Autor_ID, Cislo_revize) VALUES (?, ?, ?, ?)",
                zaznamKPridani.getId().toString(),
                zaznamKPridani.getNazev(),
                zaznamKPridani.getAutor().getId().toString(),
                zaznamKPridani.getCisloRevize());
        return zaznamKPridani;
    }

}
