using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Linq.Expressions;
using System.Text;

namespace AccessStudy.Core
{
    public class StudentOledbDal:IStudentIDal
    {
        private OledbUtil dbUtil = new OledbUtil();

        /// <summary>
        /// 获取所有学生
        /// </summary>
        /// <returns></returns>
        public List<Student> GetAll()
        {
            var dataTable = dbUtil.GetDataTable("Student");
            List<Student> students = DataTable2Model(dataTable);

            return students;
        }

        /// <summary>
        /// 按标识查询学生
        /// </summary>
        public Student Get(int studentId)
        {
            var querySql = "select * from Student where Id=@studentId";
            var paras = new List<OleDbParameter>() 
            {
                new OleDbParameter("studentId",studentId)
            };
            var dataTable = dbUtil.GetDataTable(querySql, paras);

            return DataTable2Model(dataTable).FirstOrDefault();
        }

        /// <summary>
        /// 按名称查询学生
        /// </summary>
        public Student Get(string studentName)
        {
            var querySql = "select * from Student where Name=@studentName";
            var paras = new List<OleDbParameter>()
            {
                new OleDbParameter("studentName",studentName)
            };
            var dataTable = dbUtil.GetDataTable(querySql, paras);

            return DataTable2Model(dataTable).FirstOrDefault();
        }

        /// <summary>
        /// 添加学生
        /// </summary>
        public bool Add(Student student)
        {
            var querySql = "INSERT INTO `Student` (Name,Age,Address,School) VALUES(@Name,@Age,@Address,@School); ";
            var paras = new List<OleDbParameter>()
            {
                new OleDbParameter("@Name",student.Name),
                new OleDbParameter("@Age",student.Age),
                new OleDbParameter("@Address",student.Address),
                new OleDbParameter("@School",student.School),
            };

            var effectRow = dbUtil.ExecuteNonQuery(querySql, paras);

            return effectRow > 0;
        }

        /// <summary>
        /// 更新学生
        /// </summary>
        public bool Update(Student student)
        {
            var querySql = "Update Student Set Name=@Name,Age=@Age,Address=@Address,School=@School where Id=@Id;";
            var paras = new List<OleDbParameter>()
            {
                new OleDbParameter("Name",student.Name),
                new OleDbParameter("Age",student.Age),
                new OleDbParameter("Address",student.Address),
                new OleDbParameter("School",student.School),
                new OleDbParameter("Id",student.Id),
            };

            var effectRow = dbUtil.ExecuteNonQuery(querySql, paras);

            return effectRow > 0;
        }

        /// <summary>
        /// 删除学生
        /// </summary>
        public bool Delete(int studentId)
        {
            var querySql = "DELETE FROM Student WHERE Id = @Id; ";
            var paras = new List<OleDbParameter>()
            {
                new OleDbParameter("Id",studentId),
            };

            var effectRow = dbUtil.ExecuteNonQuery(querySql, paras);

            return effectRow > 0;
        }

        /// <summary>
        /// DataTable转实体列表
        /// </summary>
        private List<Student> DataTable2Model(DataTable dTable)
        {
            List<Student> students = new List<Student>();

            if (dTable==null)
            {
                return students;
            }

            foreach (DataRow row in dTable.Rows)
            {
                var student = new Student()
                {
                    Id = (int)row["Id"],
                    Name = row["Name"]?.ToString() ?? "",
                    Age = (int)row["Age"],
                    Address = row["Address"]?.ToString() ?? "",
                    School = row["School"]?.ToString() ?? "",
                };

                students.Add(student);
            }

            return students;
        }

    }
}