using Microsoft.AspNetCore.Mvc;
using AspNetCore.Reporting;
using Microsoft.AspNetCore.Hosting;
using System.Collections.Generic;
using System.Threading.Tasks;
using System;
using System.Data;
using Oracle.EntityFrameworkCore;
using Oracle.ManagedDataAccess.Client;
using AMESCoreStudio.WebApi.Models.BAS;
using AMESCoreStudio.CommonTools.Result;
using AMESCoreStudio.Web.Models;
using AMESCoreStudio.WebApi.DTO.AMES;
using DocumentFormat.OpenXml.Math;
using AMESCoreStudio.Web.ViewModels.PCS;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using AMESCoreStudio.Web.ViewModels.RPT;

// For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860

namespace AMESCoreStudio.Web.Controllers
{
    public class RPTController : Controller
    {
        private readonly IWebHostEnvironment environment = null;
        public readonly IRPT _rptApi;

        public RPTController(IWebHostEnvironment environment, IRPT rptApi)
        {
            this.environment = environment;
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
            _rptApi = rptApi;
        }

        public async Task<IActionResult> RPT001()
        {
            var sdate = "";
            var edate = "";

            ViewBag.QueryDate = DateTime.Now.ToString("yyyy/MM");
            ViewBag.QueryDate2 = DateTime.Now.ToString("yyyyMM");

            var model = await _rptApi.GetRPT001View(sdate, edate);

            return View(model);
        }

        [HttpPost]
        public async Task<IActionResult> RPT001(string SerachData)
        {
            var Data = DateTime.Parse(SerachData);

            ViewBag.QueryDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM");
            ViewBag.QueryDate2 = new DateTime(Data.Year, Data.Month, 1).ToString("yyyyMM");

            var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
            var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
            var model = await _rptApi.GetRPT001View(sDate, eDate);

            return View(model);
        }

        public async Task<IActionResult> RPT002()
        {
            var sdate = "";
            var edate = "";
            var model = await _rptApi.GetRPT002View(sdate, edate);
            model.SerachData = DateTime.Now.ToString("yyyy/MM");
            return View(model);
        }

        [HttpPost]
        public async Task<IActionResult> RPT002(string SerachData)
        {
            var Data = DateTime.Parse(SerachData);
            var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
            var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
            var model = await _rptApi.GetRPT002View(sDate, eDate);
            model.SerachData = SerachData;
            return View(model);
        }

        public async Task<IActionResult> RPT001A(string id)
        {
            ViewData["ParamList"] = id;
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";
            switch (type)
            {
                case "01":
                    title = data.Substring(0, 4) + "生產力";
                    break;
            }
            ViewBag.Title = title;

            string MonthDataList = "<table border='1' cellpadding='2'><tr bgcolor='#66CCFF'><td width='60'>月份</td><td width='60'>01</td><td width='60'>02</td><td width='60'>03</td><td width='60'>04</td><td width='60'>05</td><td width='60'>06</td><td width='60'>07</td><td width='60'>08</td><td width='60'>09</td><td width='60'>10</td><td width='60'>11</td><td width='60'>12</td></tr><tr><td width='60'>數值</td>";
            for (int m = 1; m <= 12; m++)
            {
                var Data = DateTime.Parse(data.Substring(0, 4) + "/" + m.ToString().PadLeft(2, '0'));
                var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
                var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
                var pi = await _rptApi.GetProductionIndex4RPT001(sDate, eDate);
                if (pi.DataTotal > 0)
                {
                    double sum_productivity = 0.00;
                    foreach (var item in pi.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());

                        double productivity = double.Parse(jo["productivity"].ToString());
                        sum_productivity = sum_productivity + productivity;
                    }
                    double avg_productivity = sum_productivity / pi.DataTotal;
                    MonthDataList = MonthDataList + "<td width='60'>" + "<a href =\"javascript:hg.open('按日期統計資料','/RPT/RPT001B/" + type + "_" + Data.ToString("yyyyMM") + "',800,720);\">" + avg_productivity.ToString("0.00") + "</a></td>";
                }
                else
                {
                    MonthDataList = MonthDataList + "<td width='60'>0.00</td>";
                }

            }

            MonthDataList = MonthDataList + "</tr></table>";

            ViewData["MonthDataList"] = MonthDataList;

            return View();
        }

        [HttpPost]
        public async Task<JsonResult> GetMonthData4RPT001AAsync(string id)
        {
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";
            switch (type)
            {
                case "01":
                    title = data.Substring(0, 4) + "生產力";
                    break;
            }
            ViewBag.Title = title;
            ViewBag.Title2 = data.Substring(0, 4);

            var query = new RPT001AViewModel();

            for (int m = 1; m <= 12; m++)
            {
                var Data = DateTime.Parse(data.Substring(0, 4) + "/" + m.ToString().PadLeft(2, '0'));
                var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
                var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
                var pi = await _rptApi.GetProductionIndex4RPT001(sDate, eDate);
                if (pi.DataTotal > 0)
                {
                    double sum_productivity = 0.00;
                    foreach (var item in pi.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());

                        double productivity = double.Parse(jo["productivity"].ToString());
                        sum_productivity = sum_productivity + productivity;
                    }
                    double avg_productivity = sum_productivity / pi.DataTotal;
                    query.Datas.Add(new MonthGroup
                    {
                        Month = Data.ToString("yyyyMM"),
                        Yield = double.Parse(avg_productivity.ToString("0.00"))
                    });
                }
                else
                {
                    query.Datas.Add(new MonthGroup
                    {
                        Month = Data.ToString("yyyyMM"),
                        Yield = 0.00
                    });
                }

            }

            return Json(query.Datas);
        }

        [HttpPost]
        public async Task<JsonResult> GetDayData4RPT001BAsync(string id)
        {
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";
            switch (type)
            {
                case "01":
                    title = data + "生產力";
                    break;
            }
            ViewBag.Title = title;
            ViewBag.Title2 = data;

            var query = new RPT001BViewModel();

            var Data = DateTime.Parse(data.Substring(0, 4) + "/" + data.Substring(4));
            var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
            var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
            var pi = await _rptApi.GetProductionIndex4RPT001(sDate, eDate);

            foreach (var item in pi.Data)
            {
                JObject jo = JObject.Parse(item.ToString());
                DateTime date = DateTime.Parse(jo["productionDate"].ToString());

                query.Datas.Add(new DayGroup
                {
                    Day = date.ToString("yyyyMMdd"),
                    Yield = double.Parse(jo["productivity"].ToString())
                });
            }

            return Json(query.Datas);
        }

        public async Task<IActionResult> RPT001B(string id)
        {
            ViewData["ParamList"] = id;
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";
            switch (type)
            {
                case "01":
                    title = data + "生產力";
                    break;
            }
            ViewBag.Title = title;

            var Data = DateTime.Parse(data.Substring(0, 4) + "/" + data.Substring(4));
            var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
            var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
            var pi = await _rptApi.GetProductionIndex4RPT001(sDate, eDate);

            double day01 = 0.00, day02 = 0.00, day03 = 0.00, day04 = 0.00, day05 = 0.00, day06 = 0.00, day07 = 0.00, day08 = 0.00, day09 = 0.00, day10 = 0.00;
            double day11 = 0.00, day12 = 0.00, day13 = 0.00, day14 = 0.00, day15 = 0.00, day16 = 0.00, day17 = 0.00, day18 = 0.00, day19 = 0.00, day20 = 0.00;
            double day21 = 0.00, day22 = 0.00, day23 = 0.00, day24 = 0.00, day25 = 0.00, day26 = 0.00, day27 = 0.00, day28 = 0.00, day29 = 0.00, day30 = 0.00;
            double day31 = 0.00;
            foreach (var item in pi.Data)
            {
                JObject jo = JObject.Parse(item.ToString());
                DateTime date = DateTime.Parse(jo["productionDate"].ToString());
                switch (date.Day)
                {
                    case 1:
                        day01 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 2:
                        day02 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 3:
                        day03 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 4:
                        day04 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 5:
                        day05 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 6:
                        day06 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 7:
                        day07 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 8:
                        day08 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 9:
                        day09 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 10:
                        day10 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 11:
                        day11 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 12:
                        day12 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 13:
                        day13 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 14:
                        day14 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 15:
                        day15 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 16:
                        day16 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 17:
                        day17 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 18:
                        day18 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 19:
                        day19 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 20:
                        day20 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 21:
                        day21 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 22:
                        day22 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 23:
                        day23 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 24:
                        day24 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 25:
                        day25 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 26:
                        day26 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 27:
                        day27 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 28:
                        day28 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 29:
                        day29 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 30:
                        day30 = double.Parse(jo["productivity"].ToString());
                        break;
                    case 31:
                        day31 = double.Parse(jo["productivity"].ToString());
                        break;
                }
            }

            string DayDataList = "<table border='1' cellpadding='2'>";
            DayDataList = DayDataList + "<tr bgcolor='#66CCFF'><td width='60'>日期</td><td width='60'>01</td><td width='60'>02</td><td width='60'>03</td><td width='60'>04</td><td width='60'>05</td><td width='60'>06</td><td width='60'>07</td><td width='60'>08</td><td width='60'>09</td><td width='60'>10</td></tr>";
            DayDataList = DayDataList + "<tr><td width='60'>數值</td><td width='60'>" + day01 + "</td><td width='60'>" + day02 + "</td><td width='60'>" + day03 + "</td><td width='60'>" + day04 + "</td><td width='60'>" + day05 + "</td><td width='60'>" + day06 + "</td><td width='60'>" + day07 + "</td><td width='60'>" + day08 + "</td><td width='60'>" + day09 + "</td><td width='60'>" + day10 + "</td></tr>";
            DayDataList = DayDataList + "<tr bgcolor='#66CCFF'><td width='60'>日期</td><td width='60'>11</td><td width='60'>12</td><td width='60'>13</td><td width='60'>14</td><td width='60'>15</td><td width='60'>16</td><td width='60'>17</td><td width='60'>18</td><td width='60'>19</td><td width='60'>20</td></tr>";
            DayDataList = DayDataList + "<tr><td width='60'>數值</td><td width='60'>" + day11 + "</td><td width='60'>" + day12 + "</td><td width='60'>" + day13 + "</td><td width='60'>" + day14 + "</td><td width='60'>" + day15 + "</td><td width='60'>" + day16 + "</td><td width='60'>" + day17 + "</td><td width='60'>" + day18 + "</td><td width='60'>" + day19 + "</td><td width='60'>" + day20 + "</td></tr>";
            DayDataList = DayDataList + "<tr bgcolor='#66CCFF'><td width='60'>日期</td><td width='60'>21</td><td width='60'>22</td><td width='60'>23</td><td width='60'>24</td><td width='60'>25</td><td width='60'>26</td><td width='60'>27</td><td width='60'>28</td><td width='60'>29</td><td width='60'>30</td></tr>";
            DayDataList = DayDataList + "<tr><td width='60'>數值</td><td width='60'>" + day21 + "</td><td width='60'>" + day22 + "</td><td width='60'>" + day23 + "</td><td width='60'>" + day24 + "</td><td width='60'>" + day25 + "</td><td width='60'>" + day26 + "</td><td width='60'>" + day27 + "</td><td width='60'>" + day28 + "</td><td width='60'>" + day29 + "</td><td width='60'>" + day30 + "</td></tr>";
            DayDataList = DayDataList + "<tr bgcolor='#66CCFF'><td width='60'>日期</td><td width='60'>31</td><td width='60'></td><td width='60'></td><td width='60'></td><td width='60'></td><td width='60'></td><td width='60'></td><td width='60'></td><td width='60'></td><td width='60'></td></tr>";
            DayDataList = DayDataList + "<tr><td width='60'>數值</td><td width='60'>" + day31 + "</td><td width='60'>" + "" + "</td><td width='60'>" + "" + "</td><td width='60'>" + "" + "</td><td width='60'>" + "" + "</td><td width='60'>" + "" + "</td><td width='60'>" + "" + "</td><td width='60'>" + "" + "</td><td width='60'>" + "" + "</td><td width='60'>" + "" + "</td></tr>";

            DayDataList = DayDataList + "</table>";

            ViewData["DayDataList"] = DayDataList;

            return View();
        }
    }
}