using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        OracleConnection conn;
        OracleCommand comm;
        OracleDataAdapter da;
        DataSet ds;
        DataTable dt;
        DataRow dr;
        int i = 0;

        public Form1()
        {
            InitializeComponent();
        }

        public void connect()
        {
            string constring = "DATA SOURCE=172.16.54.24:1521/ICTORCL;USER ID=CCE230953344;PASSWORD=student";
            if (conn == null)
                conn = new OracleConnection(constring); // Assuming 'constring' is properly defined
            if (conn.State != ConnectionState.Open)
                conn.Open();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            connect();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            connect();
            MessageBox.Show("CONNECTION ESTABLISHED.");
        }

        // SHOW TABLE ELEMENTS
        private void button2_Click(object sender, EventArgs e)
        {
            comm = new OracleCommand();
            comm.CommandText = "SELECT * FROM accident";
            comm.CommandType = CommandType.Text;
            ds = new DataSet();
            da = new OracleDataAdapter(comm.CommandText, conn);
            da.Fill(ds, "accident");
            dt = ds.Tables["accident"];
            int t = dt.Rows.Count;
            MessageBox.Show(t.ToString());
            dr = dt.Rows[i]; 
            textBox1.Text = dr["REPORT_NUMBER"].ToString();
            textBox2.Text = dr["ACCD_DATE"].ToString();
            textBox3.Text = dr["LOCATION"].ToString();
            textBox4.Text = dr["TOTAL_DAMAGE"].ToString();
            conn.Close();
        }

        // NEXT
        private void button3_Click(object sender, EventArgs e)
        {
            i++;
            if (i >= dt.Rows.Count) i = 0;
            dr = dt.Rows[i];
            textBox1.Text = dr["REPORT_NUMBER"].ToString();
            textBox2.Text = dr["ACCD_DATE"].ToString();
            textBox3.Text = dr["LOCATION"].ToString();
            textBox4.Text = dr["TOTAL_DAMAGE"].ToString();
        }

        // PREVIOUS 
        private void button4_Click(object sender, EventArgs e)
        {
            i--;
            if (i < 0) i = dt.Rows.Count - 1;
            dr = dt.Rows[i];
            textBox1.Text = dr["REPORT_NUMBER"].ToString();
            textBox2.Text = dr["ACCD_DATE"].ToString();
            textBox3.Text = dr["LOCATION"].ToString();
            textBox4.Text = dr["TOTAL_DAMAGE"].ToString();
        }

        // INSERT INTO TABLE ACCIDENT
        private void button5_Click(object sender, EventArgs e)
        {
            // Parse inputs to match database column types
            int reportNumber = int.Parse(textBox1.Text);
            DateTime accDate = DateTime.Parse(textBox2.Text);
            int totalDamage = int.Parse(textBox4.Text);

            try
            {
                if (conn == null || conn.State != ConnectionState.Open)
                    connect();

                OracleCommand cm = new OracleCommand();
                cm.Connection = conn;
                cm.CommandText = "INSERT INTO accident (REPORT_NUMBER, ACCD_DATE, LOCATION, TOTAL_DAMAGE) " +
                                 "VALUES (:reportNumber, :accDate, :location, :totalDamage)";

                cm.Parameters.Add(new OracleParameter("reportNumber", OracleDbType.Int32) { Value = reportNumber });
                cm.Parameters.Add(new OracleParameter("accDate", OracleDbType.Date) { Value = accDate });
                cm.Parameters.Add(new OracleParameter("location", textBox3.Text)); 
                cm.Parameters.Add(new OracleParameter("totalDamage", OracleDbType.Int32) { Value = totalDamage });

                cm.ExecuteNonQuery();
                MessageBox.Show("Record inserted successfully!");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                    conn.Close();
            }
        }

        // UPDATE CLICK
        private void button6_Click(object sender, EventArgs e)
        {
            try
            {
                if (conn == null || conn.State != ConnectionState.Open)
                    connect();

                int reportNumber = int.Parse(textBox1.Text);
                DateTime accDate = DateTime.Parse(textBox2.Text); // Ensure this parses correctly
                string location = textBox3.Text;
                int totalDamage = int.Parse(textBox4.Text);

                OracleCommand cm = new OracleCommand();
                cm.Connection = conn;
                cm.CommandText = "UPDATE accident SET ACCD_DATE = :edate, " +
                                 "LOCATION = :eloc, TOTAL_DAMAGE = :edamage " +
                                 "WHERE REPORT_NUMBER = :erep";

                // Add parameters with explicit OracleDbType
                cm.Parameters.Add(new OracleParameter("erep", OracleDbType.Int32) { Value = reportNumber });
                cm.Parameters.Add(new OracleParameter("edate", OracleDbType.Date) { Value = accDate }); // Ensure correct type
                cm.Parameters.Add(new OracleParameter("eloc", OracleDbType.Varchar2) { Value = location });
                cm.Parameters.Add(new OracleParameter("edamage", OracleDbType.Int32) { Value = totalDamage });

                cm.ExecuteNonQuery();
                MessageBox.Show("Record updated successfully!");
            }
            catch (FormatException ex)
            {
                MessageBox.Show("Invalid input format: " + ex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
            finally
            {
                if (conn != null && conn.State == ConnectionState.Open)
                    conn.Close();
            }
        }
    }
}

