using System;
using System.Data;
using System.Windows.Forms;
using Npgsql;

namespace ZhkhApp
{
    public partial class ResidentForm : Form
    {
        private int userId;
        private decimal totalDebt = 0;

        public ResidentForm()
        {
            InitializeComponent();
            userId = MainForm.CurrentUserId;
            LoadReceipts();
            CalculateTotalDebt();
            DisplayUserInfo();
        }

        // Загрузка квитанций через представление v_receipts_full
        private void LoadReceipts()
        {
            try
            {
                // Используем представление v_receipts_full
                // Фильтруем по person_id (это issued_to_person_id в представлении)
                string query = @"
                    SELECT receipt_id, apt_number, period_month, period_year, 
                           total_sum, penalty, total_with_penalty, status, remaining_amount AS debt
                    FROM v_receipts_full
                    WHERE debtor_name ILIKE '%' || @userName || '%'
                    ORDER BY period_year DESC, period_month DESC";

                using (var conn = new NpgsqlConnection(MainForm.ConnectionString))
                {
                    conn.Open();
                    using (var adapter = new NpgsqlDataAdapter(query, conn))
                    {
                        adapter.SelectCommand.Parameters.AddWithValue("@userName", MainForm.CurrentUserFullName);
                        DataTable dt = new DataTable();
                        adapter.Fill(dt);
                        dgvReceipts.DataSource = dt;
                    }
                }

                SetRussianHeaders();
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Ошибка загрузки: {ex.Message}");
            }
        }

        // Настройка заголовков колонок
        private void SetRussianHeaders()
        {
            if (dgvReceipts.Columns["receipt_id"] != null)
                dgvReceipts.Columns["receipt_id"].HeaderText = "№";
            if (dgvReceipts.Columns["apt_number"] != null)
                dgvReceipts.Columns["apt_number"].HeaderText = "Квартира";
            if (dgvReceipts.Columns["period_month"] != null)
                dgvReceipts.Columns["period_month"].HeaderText = "Месяц";
            if (dgvReceipts.Columns["period_year"] != null)
                dgvReceipts.Columns["period_year"].HeaderText = "Год";
            if (dgvReceipts.Columns["total_sum"] != null)
                dgvReceipts.Columns["total_sum"].HeaderText = "Сумма, руб";
            if (dgvReceipts.Columns["penalty"] != null)
                dgvReceipts.Columns["penalty"].HeaderText = "Пени, руб";
            if (dgvReceipts.Columns["total_with_penalty"] != null)
                dgvReceipts.Columns["total_with_penalty"].HeaderText = "Итого, руб";
            if (dgvReceipts.Columns["status"] != null)
                dgvReceipts.Columns["status"].HeaderText = "Статус";
            if (dgvReceipts.Columns["debt"] != null)
                dgvReceipts.Columns["debt"].HeaderText = "Задолженность, руб";
        }

        // Расчёт общей задолженности (из DataGridView)
        private void CalculateTotalDebt()
        {
            totalDebt = 0;
            foreach (DataGridViewRow row in dgvReceipts.Rows)
            {
                if (row.Cells["debt"]?.Value != null)
                {
                    totalDebt += Convert.ToDecimal(row.Cells["debt"].Value);
                }
            }
            lblTotalDebt.Text = $"Общая задолженность: {totalDebt:F2} руб.";
            lblTotalDebt.ForeColor = totalDebt > 0 ? System.Drawing.Color.Red : System.Drawing.Color.Green;
        }

        // Показать пеню для выбранной квитанции (используем функцию calculate_penalty)
        private void ShowPenaltyForSelectedReceipt()
        {
            if (dgvReceipts.CurrentRow == null) return;

            int receiptId = Convert.ToInt32(dgvReceipts.CurrentRow.Cells["receipt_id"].Value);
            decimal penalty = CalculatePenalty(receiptId);

            // Можно показать в отдельной метке или в MessageBox
            lblPenaltyInfo.Text = $"Пени на сегодня: {penalty:F2} руб.";
        }

        // Вызов функции calculate_penalty из БД
        private decimal CalculatePenalty(int receiptId)
        {
            string query = "SELECT calculate_penalty(@receiptId, CURRENT_DATE)";

            using (var conn = new NpgsqlConnection(MainForm.ConnectionString))
            {
                conn.Open();
                using (var cmd = new NpgsqlCommand(query, conn))
                {
                    cmd.Parameters.AddWithValue("@receiptId", receiptId);
                    object result = cmd.ExecuteScalar();
                    return result != DBNull.Value ? Convert.ToDecimal(result) : 0;
                }
            }
        }

        private void DisplayUserInfo()
        {
            lblUserInfo.Text = $"Житель: {MainForm.CurrentUserFullName}";
        }

        private void BtnPay_Click(object sender, EventArgs e)
        {
            if (dgvReceipts.CurrentRow == null)
            {
                MessageBox.Show("Выберите квитанцию для оплаты!");
                return;
            }

            int receiptId = Convert.ToInt32(dgvReceipts.CurrentRow.Cells["receipt_id"].Value);
            decimal totalWithPenalty = Convert.ToDecimal(dgvReceipts.CurrentRow.Cells["total_with_penalty"].Value);
            decimal debt = Convert.ToDecimal(dgvReceipts.CurrentRow.Cells["debt"].Value);

            if (debt <= 0)
            {
                MessageBox.Show("Эта квитанция уже оплачена!");
                return;
            }

            var paymentForm = new PaymentForm(receiptId, totalWithPenalty, userId);
            if (paymentForm.ShowDialog() == DialogResult.OK)
            {
                LoadReceipts();
                CalculateTotalDebt();
                MessageBox.Show("Оплата прошла успешно!");
            }
        }

        private void BtnRefresh_Click(object sender, EventArgs e)
        {
            LoadReceipts();
            CalculateTotalDebt();
        }

        private void BtnLogout_Click(object sender, EventArgs e)
        {
            Application.Restart();
        }

        // При выборе строки в DataGridView показываем пеню
        private void dgvReceipts_SelectionChanged(object sender, EventArgs e)
        {
            ShowPenaltyForSelectedReceipt();
        }
    }
}