using Dapper;
using Dapper.Contrib.Extensions;
using MieSystem.Data.Interfaces;
using MieSystem.Models;

namespace MieSystem.Data.Repositories
{
    public class ExpedienteRepository : IExpedienteRepository
    {

        private readonly IDatabaseConnectionFactory _connectionFactory;

        public ExpedienteRepository(IDatabaseConnectionFactory databaseConnectionFactory) {

            _connectionFactory = databaseConnectionFactory;
        }

        /*public async Task<int> CreateAsync(Expediente expediente)
        {
            using var connection = await _connectionFactory.CreateConnectionAsync();
            return await connection.InsertAsync(expediente);
        }*/

        public async Task<int> CreateAsync(Expediente expediente)
        {
            using var connection = await _connectionFactory.CreateConnectionAsync();

            var sql = @"
        INSERT INTO expedientes (
            nombre, 
            apellidos, 
            fecha_nacimiento, 
            sexo,
            nombre_padre, 
            nombre_madre, 
            nombre_responsable, 
            parentesco_responsable,
            direccion, 
            telefono, 
            observaciones, 
            foto_url,
            fecha_creacion, 
            fecha_actualizacion, 
            activo
        ) VALUES (
            @Nombre, 
            @Apellidos, 
            @FechaNacimiento, 
            @Sexo,
            @NombrePadre, 
            @NombreMadre, 
            @NombreResponsable, 
            @ParentescoResponsable,
            @Direccion, 
            @Telefono, 
            @Observaciones, 
            @FotoUrl,
            CURRENT_TIMESTAMP, 
            CURRENT_TIMESTAMP, 
            @Activo
        )
        RETURNING id";

            var parameters = new
            {
                expediente.Nombre,
                expediente.Apellidos,
                FechaNacimiento = expediente.FechaNacimiento.Date, // Solo fecha
                expediente.Sexo,
                expediente.NombrePadre,
                expediente.NombreMadre,
                expediente.NombreResponsable,
                expediente.ParentescoResponsable,
                expediente.Direccion,
                expediente.Telefono,
                expediente.Observaciones,
                expediente.FotoUrl,
                expediente.Activo
            };

            return await connection.ExecuteScalarAsync<int>(sql, parameters);
        }


        public async Task<bool> DeleteAsync(int id)
        {
            using var connection = await _connectionFactory.CreateConnectionAsync();

            var sql = "DELETE FROM expedientes WHERE id = @Id";
            var affected = await connection.ExecuteAsync(sql, new { Id = id });

            return affected > 0;
        }

        public async Task<IEnumerable<Expediente?>> GetAllAsync()
        {
            using var connection = await _connectionFactory.CreateConnectionAsync();

            if (connection.State == System.Data.ConnectionState.Open) {
                /*var result = await connection.QueryAsync<Expediente>(
        @"SELECT 
            id,
            nombre,
            apellidos,
            fecha_nacimiento::timestamp as fecha_nacimiento, -- Convertir a timestamp
            sexo,
            nombre_padre,
            nombre_madre,
            nombre_responsable,
            parentesco_responsable,
            direccion,
            telefono,
            observaciones,
            foto_url,
            fecha_creacion,
            fecha_actualizacion,
            activo
        FROM expedientes 
        ORDER BY nombre"
    );*/


                var result = await connection.QueryAsync<Expediente>(
        @"SELECT *
        FROM expedientes 
        ORDER BY nombre"
    );
                return result;
            }
            else {
                System.Diagnostics.Debug.WriteLine("Estado de la conexion es:" + connection.State);
                return null;
            }
        }

        public async Task<Expediente?> GetByIdAsync(int id)
        {
            using var connection = await _connectionFactory.CreateConnectionAsync();
            
            Expediente? expediente = await connection.QueryFirstOrDefaultAsync<Expediente>(
                "select *from expedientes where id = @Id",
                new { Id = id }
            );
            return expediente;
        }

        public async Task<bool> UpdateAsync(Expediente expediente)
        {
            using var connection = await _connectionFactory.CreateConnectionAsync();

            // Con Dapper.Contrib
            return await connection.UpdateAsync(expediente);
        }
    }
}
