/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package adat;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author mufi
 */
public class Adatbázis {

    private static Connection conn = null;

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost/xforms", "root", "");
        } catch (SQLException ex) {
            System.err.println("Nem sikerült az adatbázishoz kapcsolódni");
        } catch (ClassNotFoundException ex) {
            System.err.println("A JDBC driver nem elérhető");
        }
    }

    public static void main(String[] args) {
        
    }

    public static int ment(int azon, String cím, String tartalom, Date dátum, List<String> szinészek, List<String> címkék, int értékelés, boolean korhatáros, int korhatár) throws SQLException {
        PreparedStatement stmt = null;
        int filmAzon = azon;
        try {
            if (filmAzon == 0) { //új beszúrása
                stmt = conn.prepareStatement("INSERT INTO filmek(cim, tartalom, kiadva, korhataros, korhatar, ertekeles) values (?, ?, ?, ?, ?, ?)");

                stmt.setString(1, cím);
                stmt.setString(2, tartalom);
                stmt.setDate(3, new java.sql.Date(dátum.getTime()));
                stmt.setBoolean(4, korhatáros);
                stmt.setInt(5, korhatár);
                stmt.setInt(6, értékelés);
                stmt.executeUpdate();
                stmt = conn.prepareStatement("SELECT azon FROM filmek WHERE cim = ? AND kiadva = ?");
                stmt.setString(1, cím);
                stmt.setDate(2, new java.sql.Date(dátum.getTime()));
                ResultSet rs = stmt.executeQuery();
                rs.next();
                filmAzon = rs.getInt(1);

                for (String c : címkék) {
                    //beszúrjuk a címkét
                    stmt = conn.prepareStatement("INSERT INTO cimkek (cimke) values (?)");
                    stmt.setString(1, c);
                    try {
                        stmt.executeUpdate();
                    } catch (com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException ex) {
                    }
                    //lekérjük a címke azonosítóját
                    stmt = conn.prepareStatement("SELECT azon FROM cimkek WHERE cimke = ?");
                    stmt.setString(1, c);
                    rs = stmt.executeQuery();
                    rs.next();
                    int címkeAzon = rs.getInt(1);
                    //Összehozzuk a filmmel a kapcsolótáblán keresztül
                    stmt = conn.prepareStatement("INSERT INTO kt_filmek_cimkek (film_azon, cimke_azon) VALUES (?, ?)");
                    stmt.setInt(1, filmAzon);
                    stmt.setInt(2, címkeAzon);
                    stmt.executeUpdate();
                }
                for (String sz : szinészek) {
                    stmt = conn.prepareStatement("INSERT INTO szineszek (nev) values (?)");
                    stmt.setString(1, sz);
                    try {
                        stmt.executeUpdate();
                    } catch (com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException ex) {
                    }

                    stmt = conn.prepareStatement("SELECT azon FROM szineszek WHERE nev = ?");
                    stmt.setString(1, sz);
                    rs = stmt.executeQuery();
                    rs.next();
                    int szinészAzon = rs.getInt(1);
                    stmt = conn.prepareStatement("INSERT INTO kt_filmek_szineszek (film_azon, szinesz_azon) VALUES (?, ?)");
                    stmt.setInt(1, filmAzon);
                    stmt.setInt(2, szinészAzon);
                    stmt.executeUpdate();
                }
                // stmt = conn.prepareStatement("SELECT cimke from cimkek")
            } else {//régi módosítása
                stmt = conn.prepareStatement("UPDATE filmek "
                        + "SET cim = ?,"
                        + "tartalom = ?,"
                        + "kiadva = ?,"
                        + "korhataros = ?,"
                        + "korhatar = ?,"
                        + "ertekeles = ? "
                        + "WHERE azon = ?;");
                stmt.setString(1, cím);
                stmt.setString(2, tartalom);
                stmt.setDate(3, new java.sql.Date(dátum.getTime()));
                stmt.setBoolean(4, korhatáros);
                stmt.setInt(5, korhatár);
                stmt.setInt(6, értékelés);
                stmt.setInt(7, filmAzon);
                stmt.executeUpdate();

                //címkék frissítése
                stmt = conn.prepareStatement("SELECT c.azon, c.cimke FROM cimkek c, kt_filmek_cimkek kt where kt.film_azon=? AND kt.cimke_azon=c.azon");
                stmt.setInt(1, filmAzon);
                ResultSet rs = stmt.executeQuery();
                Map<String, Integer> ABCímkék = new HashMap<String, Integer>();
                while (rs.next()) {
                    ABCímkék.put(rs.getString("cimke"), rs.getInt("azon"));
                }

                for (String ab : ABCímkék.keySet()) {
                    if (címkék.contains(ab)) {
                        //ABCímkék.remove(ab);
                        címkék.remove(ab);
                    } else {
                        stmt.executeUpdate("DELETE FROM kt_filmek_cimkek WHERE cimke_azon = " + ABCímkék.get(ab) + " AND film_azon = " + filmAzon);
                        ResultSet rs2 = stmt.executeQuery("SELECT * FROM kt_filmek_cimkek WHERE cimke_azon = " + ABCímkék.get(ab));
                        if (!rs2.next()) {
                            stmt.executeUpdate("DELETE FROM cimkek WHERE azon = " + ABCímkék.get(ab));
                        }
                        //ABCímkék.remove(ab);
                    }
                }
                for (String c : címkék) {
                    stmt = conn.prepareStatement("INSERT INTO cimkek (cimke) values (?)");
                    stmt.setString(1, c);
                    try {
                        stmt.executeUpdate();
                    } catch (com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException ex) {
                    }
                    //lekérjük a címke azonosítóját
                    stmt = conn.prepareStatement("SELECT azon FROM cimkek WHERE cimke = ?");
                    stmt.setString(1, c);
                    rs = stmt.executeQuery();
                    rs.next();
                    int címkeAzon = rs.getInt(1);
                    //Összehozzuk a filmmel a kapcsolótáblán keresztül
                    stmt = conn.prepareStatement("INSERT INTO kt_filmek_cimkek (film_azon, cimke_azon) VALUES (?, ?)");
                    stmt.setInt(1, filmAzon);
                    stmt.setInt(2, címkeAzon);
                    stmt.executeUpdate();
                }

                //szinészek frissítése
                stmt = conn.prepareStatement("SELECT sz.azon, sz.nev FROM szineszek sz, kt_filmek_szineszek kt where kt.film_azon=? AND kt.szinesz_azon=sz.azon");
                stmt.setInt(1, filmAzon);
                ResultSet rs1 = stmt.executeQuery();
                Map<String, Integer> ABSzínészek = new HashMap<String, Integer>();
                while (rs1.next()) {
                    ABSzínészek.put(rs1.getString("nev"), rs1.getInt("azon"));
                    
                }

                for (String ab : ABSzínészek.keySet()) {
                    if (szinészek.contains(ab)) {
                        szinészek.remove(ab);
                    } else {
                        stmt.executeUpdate("DELETE FROM kt_filmek_szineszek WHERE szinesz_azon = " + ABSzínészek.get(ab) + " AND film_azon = " + filmAzon);
                        ResultSet rs2 = stmt.executeQuery("SELECT * FROM kt_filmek_szineszek WHERE szinesz_azon = " + ABSzínészek.get(ab));
                        if (!rs2.next()) {
                            stmt.executeUpdate("DELETE FROM szineszek WHERE azon = " + ABSzínészek.get(ab));
                        }
                        
                    }
                }
                for(String s: szinészek){
                    System.out.println(s);
                }
                for (String sz : szinészek) {
                    stmt = conn.prepareStatement("INSERT INTO szineszek (nev) values (?)");
                    stmt.setString(1, sz);
                    try {
                        stmt.executeUpdate();
                    } catch (com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException ex) {
                    }

                    stmt = conn.prepareStatement("SELECT azon FROM szineszek WHERE nev = ?");
                    stmt.setString(1, sz);
                    rs = stmt.executeQuery();
                    rs.next();
                    int szinészAzon = rs.getInt(1);
                    stmt = conn.prepareStatement("INSERT INTO kt_filmek_szineszek (film_azon, szinesz_azon) VALUES (?, ?)");
                    stmt.setInt(1, filmAzon);
                    stmt.setInt(2, szinészAzon);
                    stmt.executeUpdate();
                }


            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            stmt.close();
        }

        return filmAzon;
    }

    public static String címék() {
        StringBuilder xml = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
        xml.append("<címkék xmlns=''>");
        try {
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT cimke FROM cimkek");
            while (rs.next()) {
                xml.append("<címke szöveg='" + rs.getString(1) + "'/>");
            }
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(Adatbázis.class.getName()).log(Level.SEVERE, null, ex);
        }
        xml.append("</címkék>");
        return xml.toString();
    }

    private static String filmCíkéi(int azon) {
        StringBuilder sb = new StringBuilder();
        sb.append("<címkék>");
        try {
            PreparedStatement stmt = conn.prepareStatement("SELECT cimke FROM cimkek c, kt_filmek_cimkek kt WHERE kt.film_azon = ? and kt.cimke_azon=c.azon");
            stmt.setInt(1, azon);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                sb.append("<címke szöveg = \"" + rs.getString("cimke") + "\"/>");
            }
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(Adatbázis.class.getName()).log(Level.SEVERE, null, ex);
        }
        sb.append("</címkék>");
        return sb.toString();
    }

    private static String filmSzereplői(int azon) {
        StringBuilder sb = new StringBuilder();
        sb.append("<szereplők>");
        try {
            PreparedStatement stmt = conn.prepareStatement("SELECT nev FROM szineszek sz, kt_filmek_szineszek kt WHERE kt.film_azon = ? and kt.szinesz_azon=sz.azon");
            stmt.setInt(1, azon);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                sb.append("<szereplő név = \"" + rs.getString("nev") + "\"/>");
            }
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(Adatbázis.class.getName()).log(Level.SEVERE, null, ex);
        }
        sb.append("</szereplők>");
        return sb.toString();
    }

    public static String filmek(String címke) {
        StringBuilder xml = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
        xml.append("<filmek xmlns=''>");
        try {
            PreparedStatement stmt = conn.prepareStatement(
                    "SELECT * FROM filmek WHERE azon in"
                    + "(SELECT film_azon FROM kt_filmek_cimkek where cimke_azon = "
                    + "(SELECT azon FROM cimkek WHERE cimke = ?));");
            stmt.setString(1, címke);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                xml.append("<film>");
                xml.append("<azon>" + rs.getInt("azon") + "</azon>");
                xml.append("<cím>" + rs.getString("cim") + "</cím>");
                xml.append(filmCíkéi(rs.getInt("azon")));
                xml.append("<leírás>" + rs.getString("tartalom") + "</leírás>");
                xml.append("<megjelenés>" + rs.getDate("kiadva") + "</megjelenés>");
                xml.append("<borító>" + rs.getInt("azon") + ".jpg" + "</borító>");
                xml.append("<értékelés>1</értékelés>");
                xml.append("<korhatár korhatáros='" + rs.getBoolean("korhataros") + "'>"
                        + rs.getInt("korhatar")
                        + "</korhatár>");
                xml.append(filmSzereplői(rs.getInt("azon")));
                xml.append("<borítóFájl/>");
                xml.append("</film>");

            }
        } catch (SQLException ex) {
            Logger.getLogger(Adatbázis.class.getName()).log(Level.SEVERE, null, ex);
        }
        xml.append("</filmek>");
        return xml.toString();
    }

    @Override
    protected void finalize() throws Throwable {
        conn.close();
    }
}
