using Ropin.Inspection.Model;
using Ropin.Inspection.Model.Entities;
using Ropin.Inspection.Model.SearchModel.LGS;
using Ropin.Inspection.Model.ViewModel.LGS;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace Ropin.Inspection.Repository
{
    public class TdevWebScadaDevSpotRepository : RepositoryBase<TDEV_WebScadaDevSpot, string>, ITdevWebScadaDevSpotRepository
    {
        public TdevWebScadaDevSpotRepository(InspectionDbContext DbContext) : base(DbContext)
        {

        }
        public IEnumerable<TDEV_WebScadaDevSpot> GetByCondition(Expression<Func<TDEV_WebScadaDevSpot, bool>> expression)
        {
            return DbContext.Set<TDEV_WebScadaDevSpot>().Where(expression).AsEnumerable();
        }

        public Task<IEnumerable<TDEV_WebScadaDevSpotEndity>> GetConditionAsync(TdevWebScadaDevSpotSearchModel searchModel)
        {
            MySqlConnector.MySqlParameter[] parameters = new[] {
                new MySqlConnector.MySqlParameter("Status", searchModel?.C_Status),
                new MySqlConnector.MySqlParameter("name",  "%"+searchModel?.C_Name+"%"),
                new MySqlConnector.MySqlParameter("devCode", searchModel.C_DevCode),
                new MySqlConnector.MySqlParameter("Id ", searchModel.C_ID)
            };
            StringBuilder sql = new StringBuilder();
            sql.Append(@"select * from (
select w.*,b.C_ID as C_BoxID,b.C_Name as C_BoxName 
from TDEV_WebScadaDevSpot w
LEFT JOIN TDEV_Box b on (w.C_BoxNo=b.C_BoxNo)
) tab where 1=1");

            if (!string.IsNullOrEmpty(searchModel.C_Status))
            {
                sql.Append(" and C_Status=@Status ");
            }
            if (!string.IsNullOrEmpty(searchModel.C_Name))
            {
                sql.Append(" and C_Name like @name");
            }
            if (!string.IsNullOrEmpty(searchModel.C_DevCode))
            {
                sql.Append(" and C_DevCode=@devCode ");
            }
            if (!string.IsNullOrEmpty(searchModel.C_ID))
            {
                sql.Append(" and C_ID=@Id ");
            }
            sql.Append(" order by I_Sort asc ");

            IEnumerable<TDEV_WebScadaDevSpotEndity> recordItemlist = EntityFrameworkCoreExtensions.GetList<TDEV_WebScadaDevSpotEndity>(DbContext.Database, sql.ToString(), parameters);
            searchModel.TotalCount = recordItemlist.First() != null ? recordItemlist.ToList().Count : 0;
            if (recordItemlist.Count() == 1 && recordItemlist.First() == null)
            {
                recordItemlist = null;
            }
            return Task.FromResult(searchModel.IsPagination ? recordItemlist?.Skip((searchModel.PageIndex - 1) * searchModel.PageSize).Take(searchModel.PageSize) : recordItemlist);
        }
    }
}