import java.sql.*;
import java.util.*;
import javax.swing.JOptionPane;

public class SaqueConta {
    
    public static void main( String args[] ) {
        String url = "jdbc:odbc:Banco";
        Connection connection = null;
        Statement statement = null;        
        
        // Cria a conexão com o banco
        try {
            Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
            connection = DriverManager.getConnection( url );  
            connection.setAutoCommit(false);            
        }
        catch ( ClassNotFoundException cnfex ) {
            System.err.println(
            "Driver JDBC/ODBC nao encontrado." );
            cnfex.printStackTrace();
            System.exit( 1 );  
        }
        catch ( SQLException sqlex ) {
            System.err.println( "Falha na conexao." );
            sqlex.printStackTrace();
            System.exit( 1 );              
        }
        
        // Executa o saque
        try {
            statement = connection.createStatement();
        
            // Obtém o número da conta
            String conta = JOptionPane.showInputDialog(null, 
                "Entre com o número da conta", "Saque", 
                JOptionPane.QUESTION_MESSAGE);
            
            if (conta == null) { // botão cancel
                statement.close();
                connection.close();
                System.exit(1); 
            }
            
            // Obtém o saldo atual
            ResultSet resultSet = statement.executeQuery( 
                "select saldo from contas where conta = " + conta );
            resultSet.next();
            
            JOptionPane.showMessageDialog(null, "Saldo na conta: R$" + 
                resultSet.getFloat( 1 ) , "Saque", 
                JOptionPane.INFORMATION_MESSAGE);

            // Obtém o valor do saque
            String valor = JOptionPane.showInputDialog(null, "Entre com o valor do saque", 
                "Saque", JOptionPane.QUESTION_MESSAGE);   

            if (valor == null) { // botão cancel
                statement.close();
                connection.rollback();                   
                connection.close();
                System.exit(1); 
            }

            // Inicia a transaçao de saque
            statement.execute("insert into operacoes " +
                "values(" + conta + ",'Saque',"+ valor + ")");
            statement.execute( "update contas set saldo = saldo - " + valor + 
                "where conta = " + conta +"\n" );

            // Verifica o saldo restante na conta
            resultSet = statement.executeQuery( 
                "select saldo from contas where conta = " + conta );
            resultSet.next();
            
            JOptionPane.showMessageDialog(null, "Saldo após o saque: R$" + 
                resultSet.getFloat( 1 ) , "Saque", 
                JOptionPane.INFORMATION_MESSAGE);    
            
            // Obtém a confirmação do cliente
            int confirm = JOptionPane.showConfirmDialog(null, 
                "Confirmar o Saque?", "Saque", JOptionPane.YES_NO_OPTION);
            
            if (confirm == JOptionPane.YES_OPTION) { 
                // Saque confirmado
                connection.commit();        
                JOptionPane.showMessageDialog(null, "Retire o seu dinheiro.", 
                    "Saque", JOptionPane.INFORMATION_MESSAGE);  
            } else { 
                // Saque cancelado
                connection.rollback();   
                JOptionPane.showMessageDialog(null, "Saque cancelado.", 
                    "Saque", JOptionPane.ERROR_MESSAGE);  
            }
            
            // Fecha a conexão com o banco
            statement.close();
            connection.close();
            System.exit(0); 
        }
        catch ( SQLException sqlex ) {            
            sqlex.printStackTrace();
            System.exit(1);
        }

    }
}

