using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using AMESCoreStudio.WebApi;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.WebApi.DTO.AMES;
using AMESCoreStudio.CommonTools.Result;

namespace AMESCoreStudio.WebApi.Controllers.AMES
{
    /// <summary>
    /// 錫膏規格流水碼表
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class SolderPasteSerialController : ControllerBase
    {
        private readonly AMESContext _context;

        public SolderPasteSerialController(AMESContext context)
        {
            _context = context;
        }

        [HttpGet]
        public async Task<ActionResult<IEnumerable<SolderPasteSerial>>> GetSolderPasteSerials()
        {
            return await _context.SolderPasteSerials.ToListAsync();
        }


        [HttpGet("{id}")]
        public async Task<ActionResult<SolderPasteSerial>> GetSolderPasteSerial(string id)
        {
            var solderPasteSerial = await _context.SolderPasteSerials.FindAsync(id);
            return solderPasteSerial;
        }

        /// <summary>
        /// 自動取得編號
        /// </summary>
        /// <param name="id">規格</param>
        /// <returns></returns>
        [HttpGet("AutoSerialNo/{id}")]
        public async Task<ActionResult<string>> GetSolderPasteSerialByAutoSerialNo(string id)
        {
            var item = await _context.SolderPasteSerials
                                    .Where(w => w.Description.ToUpper() == id.Trim().ToUpper()).FirstOrDefaultAsync();

            if (item == null)
                return "";
            else
            {
                var SerialNo = string.Empty;
                var Infos = _context.SolderPasteInfos.Where(w => w.SolderPasteNo.StartsWith(item.SerialNo)).Select(s => s.SolderPasteNo).Max();
                if (!string.IsNullOrWhiteSpace(Infos))
                {
                    SerialNo = $"{item.SerialNo}{(int.Parse(Infos.Substring(2, 5)) + 1).ToString().PadLeft(5, '0')}";
                }
                else
                {
                    // 根據規格對應的代碼(2碼)+流水碼(5碼)
                    SerialNo = $"{item.SerialNo}{(item.SerialNumber + 1).ToString().PadLeft(5, '0')}";
                }
                return SerialNo;
            }
        }

        /// <summary>
        /// 更新錫膏規格流水碼表
        /// </summary>
        /// <param name="solderPasteSerial"></param>
        /// <returns></returns>
        [HttpPut]
        public async Task<ResultModel<SolderPasteSerial>> PutSolderPasteSerial(SolderPasteSerial solderPasteSerial)
        {
            ResultModel<SolderPasteSerial> result = new ResultModel<SolderPasteSerial>();
            _context.Entry(solderPasteSerial).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        /// <summary>
        /// 更新錫膏規格流水碼表
        /// </summary>
        /// <param name="id">規格</param>
        /// <returns></returns>
        [HttpPut("AutoMatically/{id}")]
        public async Task<ResultModel<SolderPasteSerial>> PutSolderPasteSerialAutoMatically(string id)
        {
            ResultModel<SolderPasteSerial> result = new ResultModel<SolderPasteSerial>();
            // 流水碼加1
            string updateSql = @" UPDATE JHAMES.SOLDER_PASTE_SERIAL SET SERIAL_NUMBER = SERIAL_NUMBER + 1 , 
                                  WHERE DESCRIPTION = :Description";

            try
            {
                // 執行原生 SQL
                _context.Database.ExecuteSqlRaw(updateSql);
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        /// <summary>
        /// 新增錫膏規格流水碼表
        /// </summary>
        /// <param name="solderPasteSerial"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultModel<SolderPasteSerial>> PostSolderPasteSerial(SolderPasteSerial solderPasteSerial)
        {
            ResultModel<SolderPasteSerial> result = new ResultModel<SolderPasteSerial>();
            _context.SolderPasteSerials.Add(solderPasteSerial);
            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        // DELETE: api/SolderPasteSerial/5
        [HttpDelete("{id}")]
        public async Task<ActionResult<SolderPasteSerial>> DeleteSolderPasteSerial(string id)
        {
            var solderPasteSerial = await _context.SolderPasteSerials.FindAsync(id);
            if (solderPasteSerial == null)
            {
                return NotFound();
            }

            _context.SolderPasteSerials.Remove(solderPasteSerial);
            await _context.SaveChangesAsync();

            return solderPasteSerial;
        }

        private bool SolderPasteSerialExists(string id)
        {
            return _context.SolderPasteSerials.Any(e => e.SerialNo == id);
        }
    }
}