<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style>
    body {
        font-family: Arial, sans-serif;
        background-color: #1e1e1e;
        color: #ffffff;
        margin: 0;
        padding: 0;
    }

    .container {
        padding: 20px;
        max-width: 800px;
        margin: auto;
    }

    .tabs {
        display: flex;
        border-bottom: 2px solid #444;
        margin-bottom: 20px;
        overflow: hidden;
        border-radius: 8px 8px 0 0;
    }

    .tab {
        padding: 10px 20px;
        cursor: pointer;
        background-color: #2e2e2e;
        color: #fff;
        margin-right: 5px;
        border-radius: 8px 8px 0 0;
        transition: all 0.3s;
    }

    .tab.active {
        background-color: #0078d4;
        color: #ffffff;
    }

    .tab:hover {
        background-color: #005ea6;
    }

    .tab-content {
        display: none;
    }

    .tab-content.active {
        display: block;
    }

    input, select, button, textarea {
        width: 100%;
        padding: 10px;
        margin: 10px 0;
        border: none;
        border-radius: 8px;
        box-sizing: border-box;
        background-color: #444;
        color: #fff;
        outline: none;
        transition: all 0.3s;
    }

    button {
        background-color: #0078d4;
        cursor: pointer;
    }

    button:hover {
        background-color: #005ea6;
    }

    table {
        width: 100%;
        border-collapse: collapse;
        margin-top: 20px;
    }

    th, td {
        padding: 10px;
        border: 1px solid #444;
        text-align: left;
    }

    th {
        background-color: #555;
    }
    .row {
        display: flex;
        justify-content: space-between;
        margin-bottom: 10px;
    }

    .left-button {
        flex: 1;
        margin-right: 10px;
    }

    .right-button {
        flex: 1;
        margin-left: 10px;
    }

    .export-columns {
      display: flex;
      flex-direction: column;
      margin-bottom: 10px;
      padding: 5px;
      border: 1px solid #1c0141;
      background-color: #140514;
      max-width: 100%;
      box-sizing: border-box;
      border-radius: 4px;
      width: fit-content;
      z-index: 9999999;
    }

    .column-label {
        font-weight: bold;
        margin-bottom: 10px;
        display: block;
    }

    .data-table {
        width: 100%;
        margin-top: 10px;
    }

    .data-table th, .data-table td {
        padding: 8px;
        border: 1px solid #ccc;
        text-align: left;
    }
    </style>
    <script type="text/javascript">
        function showTab(tabId) {
            document.getElementById('<%= currentTab.ClientID %>').value = tabId;

            var tabs = document.getElementsByClassName('tab-content');
            for (var i = 0; i < tabs.length; i++) {
                tabs[i].classList.remove('active');
            }
            document.getElementById(tabId).classList.add('active');

            var tabHeaders = document.getElementsByClassName('tab');
            for (var j = 0; j < tabHeaders.length; j++) {
                tabHeaders[j].classList.remove('active');
            }
            document.querySelector('[data-tab="' + tabId + '"]').classList.add('active');
        }

        window.onload = function () {
            var savedTab = document.getElementById('<%= currentTab.ClientID %>').value || 'connectionTab';
            showTab(savedTab);
        };
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <div class="container">
            <!-- Tabs -->
            <div class="tabs">
                <div class="tab" data-tab="connectionTab" onclick="showTab('connectionTab')">Connection String</div>
                <div class="tab" data-tab="selectDbTab" onclick="showTab('selectDbTab')">Select Database</div>
                <div class="tab" data-tab="dataTab" onclick="showTab('dataTab')">Data Viewer</div>
            </div>

            <asp:HiddenField ID="currentTab" runat="server" />

            <!-- Connection String Tab -->
            <div id="connectionTab" class="tab-content active">
                <h3>Connection String</h3>
                <asp:TextBox ID="txtConnectionString" runat="server" TextMode="MultiLine" Rows="3" placeholder="Enter connection string"></asp:TextBox>
                <asp:Button ID="btnConnect" runat="server" Text="Connect" OnClick="Connect_Click" />
                <asp:Label ID="lblConnectionError" runat="server" CssClass="error" Visible="false"></asp:Label>
            </div>

            <!-- Select Database Tab -->
            <div id="selectDbTab" class="tab-content">
                <h3>Select Database</h3>
                <asp:DropDownList ID="ddlDatabases" runat="server" AutoPostBack="true" OnSelectedIndexChanged="Database_Changed"></asp:DropDownList>
                <asp:DropDownList ID="ddlTables" runat="server" AutoPostBack="true" OnSelectedIndexChanged="Table_Changed"></asp:DropDownList>
                <div class="row">
                    <asp:TextBox ID="txtQuery" runat="server" TextMode="MultiLine" Rows="4" placeholder="Enter your query here"></asp:TextBox>
                </div>
                <div class="row">
                    <asp:Button ID="btnExecuteQuery" runat="server" Text="Execute Query" OnClick="ExecuteQuery_Click" CssClass="left-button" />
                    <asp:Button ID="btnExportCsv" runat="server" Text="Export to CSV" OnClick="ExportToCsv_Click" CssClass="right-button" />
                </div>
                <div class="export-columns">
                    <asp:Label ID="lblColumns" runat="server" Text="Export Columns:" CssClass="column-label" />
                    <asp:GridView ID="gridColumns" runat="server" AutoGenerateColumns="True" CssClass="grid-view" />
                </div>
            </div>

            <!-- Data Viewer Tab -->
            <div id="dataTab" class="tab-content">
                <h3>Data Viewer</h3>
                <asp:GridView ID="gridData" runat="server" CssClass="data-table"></asp:GridView>
            </div>
        </div>
    </form>
</body>


</html>

<script runat="server">
    protected void Connect_Click(object sender, EventArgs e)
    {
        string connectionString = txtConnectionString.Text.Trim();
        try
        {
            // Test connection
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                Session["ConnectionString"] = connectionString; // Save to session
            }

            // Populate databases
            PopulateDatabases();
            currentTab.Value = "selectDbTab"; // Switch to Select Database tab
        }
        catch (Exception ex)
        {
            lblConnectionError.Text = "Connection failed: " + ex.Message;
            lblConnectionError.Visible = true;
        }
    }

    protected void PopulateDatabases()
    {
        using (SqlConnection connection = new SqlConnection(Session["ConnectionString"].ToString()))
        {
            connection.Open();
            SqlCommand command = new SqlCommand("SELECT name FROM sys.databases ORDER BY name", connection);
            SqlDataReader reader = command.ExecuteReader();
            ddlDatabases.DataSource = reader;
            ddlDatabases.DataTextField = "name";
            ddlDatabases.DataValueField = "name";
            ddlDatabases.DataBind();
        }
    }

    protected void Database_Changed(object sender, EventArgs e)
    {
        gridData.DataSource = null;
        gridData.DataBind();
        PopulateTables();
    }

    protected void PopulateTables()
    {
        using (SqlConnection connection = new SqlConnection(Session["ConnectionString"].ToString()))
        {
            connection.Open();
            connection.ChangeDatabase(ddlDatabases.SelectedValue);
            SqlCommand command = new SqlCommand("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME", connection);
            SqlDataReader reader = command.ExecuteReader();
            ddlTables.DataSource = reader;
            ddlTables.DataTextField = "TABLE_NAME";
            ddlTables.DataValueField = "TABLE_NAME";
            ddlTables.DataBind();
        }
    }

    protected void Table_Changed(object sender, EventArgs e)
    {
        gridData.DataSource = null;
        gridData.DataBind();
        PopulateColumns();
    }

    protected void PopulateColumns()
    {
        using (SqlConnection connection = new SqlConnection(Session["ConnectionString"].ToString()))
        {
            connection.Open();
            connection.ChangeDatabase(ddlDatabases.SelectedValue);
    
            string query = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName";
            SqlCommand command = new SqlCommand(query, connection);
            
            command.Parameters.AddWithValue("@TableName", ddlTables.SelectedValue);
    
            SqlDataReader reader = command.ExecuteReader();
    
            if (reader.HasRows)
            {
                DataTable dt = new DataTable();
                dt.Load(reader);
    
                gridColumns.DataSource = dt;
                gridColumns.DataBind();
            }
    
            reader.Close();
        }
    }


    protected void ExecuteQuery_Click(object sender, EventArgs e)
    {
        try
        {
            using (SqlConnection connection = new SqlConnection(Session["ConnectionString"].ToString()))
            {
                connection.Open();
                connection.ChangeDatabase(ddlDatabases.SelectedValue);
                SqlDataAdapter adapter = new SqlDataAdapter(txtQuery.Text.Trim(), connection);
                DataTable table = new DataTable();
                adapter.Fill(table);
                gridData.DataSource = table;
                gridData.DataBind();
                currentTab.Value = "dataTab"; // Switch to Data Viewer tab
            }
        }
        catch (Exception ex)
        {
            lblConnectionError.Text = "Error: " + ex.Message;
            lblConnectionError.Visible = true;
        }
    }

    protected void ExportToCsv_Click(object sender, EventArgs e)
    {
        string txtQueryString = txtQuery.Text.Trim();
        string selectedDb = ddlDatabases.SelectedValue;
        try
        {
            using (SqlConnection connection = new SqlConnection(Session["ConnectionString"].ToString()))
            {
                connection.Open();
                SqlCommand command = new SqlCommand("USE [" + selectedDb + "]; " + txtQuery.Text.Trim(), connection);
                SqlDataReader reader = command.ExecuteReader();

                StringBuilder csv = new StringBuilder();

                for (int i = 0; i < reader.FieldCount; i++)
                {
                    csv.Append(reader.GetName(i) + ",");
                }
                csv.Length--;
                csv.AppendLine();

                while (reader.Read())
                {
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        csv.Append(reader[i].ToString() + ",");
                    }
                    csv.Length--;
                    csv.AppendLine();
                }

                string fileName = "Export_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv";
                Response.Clear();
                Response.ContentType = "text/csv";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
                Response.Write(csv.ToString());
                Response.End();
            }
        }
        catch (Exception ex)
        {
            lblConnectionError.Text = "Error: " + ex.Message;
            lblConnectionError.Visible = true;
        }
    }
</script>
