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

namespace ZhkhApp
{
    public partial class ReportForm : Form
    {
        public ReportForm()
        {
            InitializeComponent();
            LoadDebtReport();
            LoadPaymentHistory();
        }

        // 1. Отчёт по задолженности (используем v_apartment_debt)
        private void LoadDebtReport()
        {
            try
            {
                string query = @"
                    SELECT apt_number, address, total_accrued, total_paid, current_debt
                    FROM v_apartment_debt
                    WHERE current_debt > 0
                    ORDER BY current_debt DESC";

                using (var conn = new NpgsqlConnection(MainForm.ConnectionString))
                {
                    conn.Open();
                    using (var adapter = new NpgsqlDataAdapter(query, conn))
                    {
                        DataTable dt = new DataTable();
                        adapter.Fill(dt);
                        dgvDebt.DataSource = dt;

                        // Подсчёт общей суммы задолженности
                        decimal totalDebt = 0;
                        foreach (DataRow row in dt.Rows)
                        {
                            totalDebt += Convert.ToDecimal(row["current_debt"]);
                        }
                        lblTotalDebt.Text = $"Общая задолженность: {totalDebt:F2} руб.";
                    }
                }
                SetDebtHeaders();
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Ошибка загрузки отчёта по задолженности: {ex.Message}");
            }
        }

        // 2. История платежей (используем v_payment_history)
        private void LoadPaymentHistory()
        {
            try
            {
                string query = @"
                    SELECT apt_number, payer_name, period_month, period_year, 
                           payment_date, amount, payment_method
                    FROM v_payment_history
                    ORDER BY payment_date DESC
                    LIMIT 100";

                using (var conn = new NpgsqlConnection(MainForm.ConnectionString))
                {
                    conn.Open();
                    using (var adapter = new NpgsqlDataAdapter(query, conn))
                    {
                        DataTable dt = new DataTable();
                        adapter.Fill(dt);
                        dgvPayments.DataSource = dt;
                    }
                }
                SetPaymentHeaders();
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Ошибка загрузки истории платежей: {ex.Message}");
            }
        }

        // 3. Отчёт по квитанциям за период (используем v_receipts_full)
        private void LoadReceiptsReport(DateTime startDate, DateTime endDate)
        {
            try
            {
                string query = @"
                    SELECT receipt_id, apt_number, full_address, period_month, period_year,
                           total_sum, penalty, total_with_penalty, status, remaining_amount
                    FROM v_receipts_full
                    WHERE period_year BETWEEN @startYear AND @endYear
                    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("@startYear", startDate.Year);
                        adapter.SelectCommand.Parameters.AddWithValue("@endYear", endDate.Year);
                        DataTable dt = new DataTable();
                        adapter.Fill(dt);
                        dgvReceipts.DataSource = dt;
                    }
                }
                SetReceiptHeaders();

                // Подсчёт итогов
                decimal totalSum = 0;
                decimal totalPenalty = 0;
                decimal totalRemaining = 0;
                foreach (DataGridViewRow row in dgvReceipts.Rows)
                {
                    totalSum += Convert.ToDecimal(row.Cells["total_sum"]);
                    totalPenalty += Convert.ToDecimal(row.Cells["penalty"]);
                    totalRemaining += Convert.ToDecimal(row.Cells["remaining_amount"]);
                }
                lblSummary.Text = $"Итого начислено: {totalSum:F2} руб. | Пени: {totalPenalty:F2} руб. | Задолженность: {totalRemaining:F2} руб.";
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Ошибка загрузки отчёта: {ex.Message}");
            }
        }

        // Установка заголовков для dgvDebt
        private void SetDebtHeaders()
        {
            if (dgvDebt.Columns["apt_number"] != null)
                dgvDebt.Columns["apt_number"].HeaderText = "Квартира";
            if (dgvDebt.Columns["address"] != null)
                dgvDebt.Columns["address"].HeaderText = "Адрес";
            if (dgvDebt.Columns["total_accrued"] != null)
                dgvDebt.Columns["total_accrued"].HeaderText = "Начислено, руб";
            if (dgvDebt.Columns["total_paid"] != null)
                dgvDebt.Columns["total_paid"].HeaderText = "Оплачено, руб";
            if (dgvDebt.Columns["current_debt"] != null)
                dgvDebt.Columns["current_debt"].HeaderText = "Задолженность, руб";
        }

        // Установка заголовков для dgvPayments
        private void SetPaymentHeaders()
        {
            if (dgvPayments.Columns["apt_number"] != null)
                dgvPayments.Columns["apt_number"].HeaderText = "Квартира";
            if (dgvPayments.Columns["payer_name"] != null)
                dgvPayments.Columns["payer_name"].HeaderText = "Плательщик";
            if (dgvPayments.Columns["period_month"] != null)
                dgvPayments.Columns["period_month"].HeaderText = "Месяц";
            if (dgvPayments.Columns["period_year"] != null)
                dgvPayments.Columns["period_year"].HeaderText = "Год";
            if (dgvPayments.Columns["payment_date"] != null)
                dgvPayments.Columns["payment_date"].HeaderText = "Дата оплаты";
            if (dgvPayments.Columns["amount"] != null)
                dgvPayments.Columns["amount"].HeaderText = "Сумма, руб";
            if (dgvPayments.Columns["payment_method"] != null)
                dgvPayments.Columns["payment_method"].HeaderText = "Способ оплаты";
        }

        // Установка заголовков для dgvReceipts
        private void SetReceiptHeaders()
        {
            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["full_address"] != null)
                dgvReceipts.Columns["full_address"].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["remaining_amount"] != null)
                dgvReceipts.Columns["remaining_amount"].HeaderText = "Остаток, руб";
        }

        // Обработчик кнопки "Сформировать отчёт по квитанциям"
        private void BtnGenerateReport_Click(object sender, EventArgs e)
        {
            DateTime startDate = dtpStartDate.Value;
            DateTime endDate = dtpEndDate.Value;
            LoadReceiptsReport(startDate, endDate);
        }

        // Обработчик кнопки "Обновить задолженность"
        private void BtnRefreshDebt_Click(object sender, EventArgs e)
        {
            LoadDebtReport();
        }

        // Обработчик кнопки "Обновить историю"
        private void BtnRefreshPayments_Click(object sender, EventArgs e)
        {
            LoadPaymentHistory();
        }

        private void BtnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}