using ProjectLibrary.Entities;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using Dapper;
using System.Collections.Generic;
using ProjectLibrary.Repositores;

namespace ProjectLibrary.Repositories
{
    public class ReaderRepository : IReaderRepository
    {
        private readonly IConnectionString _connectionString;
        private readonly ILogger<ReaderRepository> _logger;

        public ReaderRepository(IConnectionString connectionString, ILogger<ReaderRepository> logger)
        {
            _connectionString = connectionString;
            _logger = logger;
        }

        // Добавление нового читателя
        public void CreateReader(Reader reader)
        {
            _logger.LogInformation("Добавление читателя");
            _logger.LogDebug("Читатель: {json}", JsonConvert.SerializeObject(reader));
            try
            {
                using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
                var queryInsert = @"
                    INSERT INTO Reader (Name, ReaderTicket, RegistrationDateRT)  -- Используем правильные названия столбцов из вашей таблицы
                    VALUES (@Name, @ReaderTicket, @RegistrationDateRT)";
                connection.Execute(queryInsert, reader);
                _logger.LogInformation("Читатель успешно добавлен");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка при добавлении читателя");
                throw;
            }
        }

        // Обновление информации о читателе
        public void UpdateReader(Reader reader)
        {
            _logger.LogInformation("Редактирование читателя");
            _logger.LogDebug("Читатель: {json}", JsonConvert.SerializeObject(reader));
            try
            {
                using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
                var queryUpdate = @"
                    UPDATE Reader  -- Используем правильное имя таблицы
                    SET
                        Name = @Name,   -- Используем правильные названия столбцов
                        ReaderTicket = @ReaderTicket,
                        RegistrationDateRT = @RegistrationDateRT
                    WHERE ID = @ID";
                var affectedRows = connection.Execute(queryUpdate, new
                {
                    Name = reader.Name,
                    ReaderTicket = reader.ReaderTicket,
                    RegistrationDateRT = reader.RegistrationDateRT,
                    ID = reader.Id
                });

                if (affectedRows > 0)
                {
                    _logger.LogInformation("Читатель успешно обновлен");
                }
                else
                {
                    _logger.LogWarning("Читатель с ID={Id} не найден для обновления", reader.Id);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка при редактировании читателя");
                throw;
            }
        }

        // Удаление читателя
        public void DeleteReader(int id)
        {
            _logger.LogInformation("Удаление читателя с ID={id}", id);
            try
            {
                using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
                var queryDelete = @"
                    DELETE FROM Reader  -- Используем правильное имя таблицы
                    WHERE ID = @id";
                var affectedRows = connection.Execute(queryDelete, new { id });

                if (affectedRows > 0)
                {
                    _logger.LogInformation("Читатель с ID={id} успешно удален", id);
                }
                else
                {
                    _logger.LogWarning("Читатель с ID={id} не найден для удаления", id);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка при удалении читателя с ID={id}", id);
                throw;
            }
        }

        // Получение читателя по ID
        public Reader ReadReaderById(int id)
        {
            _logger.LogInformation("Получение читателя по ID={id}", id);
            try
            {
                using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
                var querySelect = @"
                    SELECT * FROM Reader  -- Используем правильное имя таблицы
                    WHERE ID = @id";
                var reader = connection.QueryFirstOrDefault<Reader>(querySelect, new { id });

                if (reader != null)
                {
                    _logger.LogDebug("Найден читатель: {json}", JsonConvert.SerializeObject(reader));
                }
                else
                {
                    _logger.LogWarning("Читатель с ID={id} не найден", id);
                }

                return reader;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка при поиске читателя");
                throw;
            }
        }

        // Получение всех читателей
        public List<Reader> ReadReaders()
        {
            _logger.LogInformation("Получение всех читателей");
            try
            {
                using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
                var querySelect = "SELECT * FROM Reader";  // Используем правильное имя таблицы
                var readers = connection.Query<Reader>(querySelect).ToList();
                _logger.LogDebug("Полученные читатели: {json}", JsonConvert.SerializeObject(readers));
                return readers;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка при чтении списка читателей");
                throw;
            }
        }
    }
}