package convertmeplease;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Main {

    static String ACCESS_DB_FILE_PATH = "D:/Hadeeth.mdb";
    static String MYSQL_DUMP_PATH = "D:/Hadeeth_Dump.sql";

    static String comma = ", ";
    static String escape = "\\'";
    static String NULL = "null";
    static String appos = "'";

    public static void main(String[] args) {
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            java.util.Properties prop = new java.util.Properties();
            prop.put("charSet", "windows-1256");
            Connection aConn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ACCESS_DB_FILE_PATH, prop);

            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(MYSQL_DUMP_PATH), "utf-8"));

            String fin = ");\n";

            ResultSet rs = aConn.createStatement().executeQuery("SELECT * FROM books");
            String insb = "INSERT INTO books (BookNo, Name, Author, Details) \nVALUES (";

            writer.write("\n\n\n\n# Inserting books records\n\n\n\n");
            while (rs.next()) {
                writer.write(insb);
                writer.write(String.valueOf(rs.getInt(1)));
                writer.write(comma);
                writer.write(unescape(rs.getString(2)));
                writer.write(comma);
                writer.write(unescape(rs.getString(3)));
                writer.write(comma);
                writer.write(unescape(rs.getString(4)));
                writer.write(fin);
            }

            rs = aConn.createStatement().executeQuery("SELECT * FROM titles");
            String inst = "INSERT INTO titles (BookNo, Vol, Ktb, Bab, SubBAB, Title, Description) \nVALUES (";

            writer.write("\n\n\n\n# Inserting titles records\n\n\n\n");
            while (rs.next()) {
                writer.write(inst);
                writer.write(String.valueOf(rs.getInt(1)));
                writer.write(comma);
                writer.write(String.valueOf(rs.getInt(2)));
                writer.write(comma);
                writer.write(String.valueOf(rs.getInt(3)));
                writer.write(comma);
                writer.write(String.valueOf(rs.getInt(4)));
                writer.write(comma);
                writer.write(String.valueOf(rs.getInt(5)));
                writer.write(comma);
                writer.write(unescape(rs.getString(7)));
                writer.write(comma);
                writer.write(unescape(rs.getString(8)));
                writer.write(fin);
            }

            rs = aConn.createStatement().executeQuery("SELECT * FROM hadeeths");
            String insh = "INSERT INTO hadeeths (BookNo, TitleID, HadeethID, HadeethNo, Hadeeth, Tashkeel) \nVALUES (";
            
            writer.write("\n\n\n\n# Inserting hadeeths records\n\n\n\n");
            while (rs.next()) {
                writer.write(insh);
                writer.write(String.valueOf(rs.getInt(1)));
                writer.write(comma);
                writer.write(String.valueOf(rs.getInt(2)));
                writer.write(comma);
                writer.write(String.valueOf(rs.getInt(3)));
                writer.write(comma);
                writer.write(String.valueOf(rs.getInt(4)));
                writer.write(comma);
                writer.write(unescape(rs.getString(5)));
                writer.write(comma);
                writer.write(unescape(rs.getString(6)));
                writer.write(fin);
            }

            writer.flush();
            writer.close();
        } catch (ClassNotFoundException es) {
            es.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    static String unescape(String s) {
        if (s == null) {
            return NULL;
        } else {
            s = s.replace(appos, escape);
            if (s.startsWith(escape)) {
                s = appos + s.substring(2, s.length());
            }
            if (s.endsWith(escape)) {
                s = s.substring(0, s.length() - 2) + appos;
            }
            return s.startsWith(appos) ? (s.endsWith(appos) ? s : s + appos) : (appos + (s.endsWith(appos) ? s : s + appos));
        }
    }
}
