using Dapper;
using SolarPower.Helper;
using SolarPower.Models;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;

namespace SolarPower.Repository.Implement
{
    public class StationReportRepository : RepositoryBase<StationReport>, IStationReportRepository
    {
        public StationReportRepository(IDatabaseHelper databaseHelper) : base(databaseHelper)
        {
            tableName = "power_station";
        }


        public async Task<List<string>> GetInverterId(string DBname, Select_table post)
        {
            List<string> result = new List<string>();
            using (IDbConnection conn = _databaseHelper.GetConnection())
            {
                conn.Open();
                try
                {
                    string sql = @$"SELECT InverterId from {DBname}.inverter i left JOIN {DBname}.controller c ON i.ControllerId = c.Id 
                                    WHERE i.Deleted != 1 AND c.PowerStationId = {post.PowerStation}";
                    result = (await conn.QueryAsync<string>(sql)).ToList();
                }
                catch (Exception exception)
                {
                    throw exception;
                }
                finally
                {
                    conn.Close();
                }
                return result;
            }
        }

        public async Task<dynamic> Gettablebody(Select_table post)
        {
            using (IDbConnection conn = _databaseHelper.GetConnection())
            {
                dynamic a;
                conn.Open();
                try
                {
                    string sql = "";
                    switch(post.FormType)
                    {
                        case 0:
                            sql = @$"
                            SET @sql = NULL;
                            SELECT
                                GROUP_CONCAT(DISTINCT
                                CONCAT('max(case when INVERTERID = ''', INVERTERID, ''' then a.KWH end) ''inv_', right(INVERTERID, 4), '''')
                                ) INTO @sql
                            FROM inverter_history_hour where powerstationId = {post.PowerStation};
                            SET @sql = CONCAT('SELECT DATE_FORMAT(a.TIMESTAMP,''%m-%d %H'') report_date, ', @sql, 
                                    ', b.KWH hourKWH, round((b.KWH / (SELECT MAX(TODAYKWH) FROM power_station_history_hour WHERE DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}'' and powerstationid = {post.PowerStation}))*100,2) ''hourKWHp'',  d.irradiance ''irradiance'', d.Temperature ''temperature'',
                                        b.money ''hourmoney'',  c.TODAYKWH ''totKWH'', c.KWHKWP ''totKWHKWP'', c.money ''totmoney'',  stationName, powerRate daymoney, c.SOLARHOUR tothour,round(b.PR, 2) as pr
                                    FROM inverter_history_hour a left join 
                                        ( # 每小時加總 inv 
                                        select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d %H:%i'') report_date, siteid, sitetype, round(KWH, 2) KWH, 
                                        round(TODAYKWH, 2) TODAYKWH,round(KWHKWP, 2) KWHKWP, round(PR, 2) PR, round(money, 2)  money 
                                        from power_station_history_hour
                                        where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}''
                                        ) b on a.powerStationid = b.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d %H:%i'') = b.report_date
                                        left join 
                                        ( # day
                                        select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') report_date, sitetype, round(TODAYKWH, 2) TODAYKWH,round(KWHKWP, 2) KWHKWP
                                        , round(PR, 2) PR, round(money, 2)  money , round(SOLARHOUR, 2) SOLARHOUR
                                        from power_station_history_day
                                        where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}''
                                        ) c on  a.powerStationid = c.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = c.report_date
                                        left join 
                                        (
                                        select powerStationID, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d %H:%i'')report_date, irradiance, Temperature  
                                        from sensor_history_hour  
                                        where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}''  
                                        ) d on  a.powerStationid = d.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d %H:%i'') = d.report_date
                                        join 
                                        (
                                        select id, name stationName, powerRate from power_station where id = {post.PowerStation}
                                        )z on a.powerstationid = z.id          
                                        where DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}''
                                        GROUP BY DATE_FORMAT(TIMESTAMP,''%Y-%m-%d %H:%i'')
                                        order by DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d %H:%i'') ');

                                        #select  @sql as 'mySelect'; #顯示動態語法
                                        PREPARE stmt FROM @sql; 
                                        EXECUTE stmt;
                                        DEALLOCATE PREPARE stmt;";
                            break;
                        case 1:
                            if(post.SearchType == 2)
                            {
                                sql = @$"
                                SET @sql = NULL;
                                SELECT
                                  GROUP_CONCAT(DISTINCT
                                    CONCAT('max(case when INVERTERID = ''', INVERTERID, ''' then round(a.KWH, 2) end) ''inv_', right(INVERTERID, 4), '''')
                                  ) INTO @sql
                                FROM inverter_history_hour where powerstationId = {post.PowerStation};
                                SET @sql = CONCAT('SELECT DATE_FORMAT(a.TIMESTAMP,''%m/%d'') report_date, ', @sql, 
                                         ',b.TODAYKWH ''dayKWH'', round((b.TODAYKWH / c.monthKWH)*100,2) ''dayKWHp'', b.SOLARHOUR ''tothour'',  b.KWHKWP ''KWHKWP'', b.PR,
                                  d.irradiance ''irradiance'', d.Temperature ''temperature'', b.money ''soldmoney'', 
                                 c.monthKWH ''monthKWH'', c.money ''monthmoney'',  stationName, powerRate ''monthmoneyone'',SolarType,SiteDB
                                         FROM inverter_history_day a left join 
                                          ( # 每日加總 inv 
                                           select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') report_date, siteid, sitetype, #, round(KWH, 2) KWH, 
                                             round(todayKWH, 2) todayKWH,round(KWHKWP, 2) KWHKWP, round(PR, 2) PR, ifnull(round(money, 2),0) money, round(SOLARHOUR, 2) SOLARHOUR
                                           from power_station_history_day
                                           where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m'') = ''{post.Time}''  
                                          ) b on a.powerStationid = b.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = b.report_date
                                          left join 
                                          ( # month
                                           select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m'') report_date, sitetype, round(monthKWH, 2) monthKWH,round(KWHKWP, 2) KWHKWP
                                           , round(PR, 2) PR, round(money, 2)  money , round(SOLARHOUR, 2) SOLARHOUR
                                           from power_station_history_month
                                           where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m'') = ''{post.Time}''
                                          ) c on  a.powerStationid = c.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m'') = c.report_date
                                          left join 
                                          (
                                           select powerStationID, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'')report_date, irradiance, Temperature  
                                           from sensor_history_day
                                           where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m'') = ''{post.Time}''  
                                          ) d on  a.powerStationid = d.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = d.report_date
                                          join 
                                          (
                                           select id, name stationName, powerRate,SolarType,SiteDB from power_station where id = {post.PowerStation}
                                          )z on a.powerstationid = z.id          
                                          where DATE_FORMAT(a.TIMESTAMP,''%Y-%m'') = ''{post.Time}''
                                          GROUP BY DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'')
                                          order by DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'')  ');

                                # select  @sql as 'mySelect'; #顯示動態語法
                                 PREPARE stmt FROM @sql; 
                                 EXECUTE stmt;
                                 DEALLOCATE PREPARE stmt;";
                            }
                            else
                            {
                                var times = post.Time.Replace('-', 'a').Replace('/', '-').Replace(" ", "").Split('a');

                                sql = @$"SET @sql = NULL;
                                    SELECT
                                      GROUP_CONCAT(DISTINCT
                                        CONCAT('max(case when INVERTERID = ''', INVERTERID, ''' then round(a.KWH, 2) end) ''inv_', right(INVERTERID, 4), '''')
                                      ) INTO @sql
                                    FROM inverter_history_hour where powerstationId = {post.PowerStation};
                                SET @sql = CONCAT('SELECT DATE_FORMAT(a.TIMESTAMP,''%m/%d'') report_date, ', @sql, 
                                         ',b.TODAYKWH ''dayKWH'', round((b.TODAYKWH / c.monthKWH)*100,2) ''dayKWHp'', b.SOLARHOUR ''tothour'',  b.KWHKWP ''KWHKWP'', b.PR,
                                  d.irradiance ''irradiance'', d.Temperature ''temperature'', b.money ''soldmoney'', 
                                 c.monthKWH ''monthKWH'', c.money ''monthmoney'',  stationName, powerRate ''monthmoneyone'',SolarType,SiteDB
                                         FROM inverter_history_day a left join 
                                              ( # 每日加總 inv 
                                               select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') report_date, siteid, sitetype, #, round(KWH, 2) KWH, 
                                                 round(todayKWH, 2) todayKWH,round(KWHKWP, 2) KWHKWP, round(PR, 2) PR, ifnull(round(money, 2),0) money, round(SOLARHOUR, 2) SOLARHOUR
                                               from power_station_history_day
                                               where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}''
                                              ) b on a.powerStationid = b.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = b.report_date
                                              left join 
                                              ( # month
                                                SELECT powerStationid, ROUND(AVG(TODAYKWH),2) AS monthKWH,
		                                         ROUND(AVG(KWHKWP),2)  AS KWHKWP,
	  	                                         ROUND(AVG(PR),2) AS PR,
		                                         ROUND(SUM(MONEY),2) AS money,
		                                         ROUND(SUM(SOLARHOUR),2)  AS SOLARHOUR
                                         FROM power_station_history_day where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}''
                                              ) c on  a.powerStationid = c.powerStationid 
                                              left join 
                                              (
                                               select powerStationID, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'')report_date, irradiance, Temperature  
                                               from sensor_history_day
                                               where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}''
                                              ) d on  a.powerStationid = d.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = d.report_date
                                              join 
                                              (
                                               select id, name stationName, powerRate, SolarType, SiteDB   from power_station where id = {post.PowerStation}
                                              )z on a.powerstationid = z.id          
                                              where DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}''
                                              GROUP BY DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'')
                                              order by DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'')  ');

                                    # select  @sql as 'mySelect'; #顯示動態語法
                                     PREPARE stmt FROM @sql; 
                                     EXECUTE stmt;
                                     DEALLOCATE PREPARE stmt;";
                            }

                            break;
                    }
                    a = await conn.QueryAsync<dynamic>(sql);
                }
                catch (Exception exception)
                {
                    throw exception;
                }
                finally
                {
                    conn.Close();
                }
                return a;
            }
        }

        public async Task<List<Landinfo>> GetHire (PsIdAndSiteDB post)
        {
            List<Landinfo> result = new List<Landinfo>();
            using (IDbConnection conn = _databaseHelper.GetConnection())
            {
                conn.Open();
                try
                {
                    string sql = @$"SELECT LeaseRate,Landowner from {post.SiteDB}.land_building WHERE PowerStationId = {post.PowerstationId}";
                    result = (await conn.QueryAsync<Landinfo>(sql)).ToList();
                }
                catch (Exception exception)
                {
                    throw exception;
                }
                finally
                {
                    conn.Close();
                }
                return result;
            }
        }

        public async Task<List<MaxFormbody>> GetMaxtablebody(Select_table2 post)
        {
            List<MaxFormbody> result = new List<MaxFormbody>();
            using (IDbConnection conn = _databaseHelper.GetConnection())
            {
                conn.Open();
                try
                {
                    List<int> ids = new List<int>();
                    foreach (var i in post.PowerStation)
                    {
                        ids.Add(Convert.ToInt32(i.Value));
                    }
                    string[] times = { };
                    if(post.SearchType == 1)
                    {
                        times = post.Time.Replace('-', 'a').Replace('/', '-').Replace(" ", "").Split('a');
                    }
                   
                    var wheretime = post.SearchType switch
                    {
                        0 => $"AND DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d') = '{post.Time}'",
                        1 => $"AND DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d') BETWEEN '{times[0]}' AND '{times[1]}'",
                        2 => $"AND DATE_FORMAT(ps.TIMESTAMP,'%Y-%m') = '{post.Time}'",
                        3 => $"AND DATE_FORMAT(ps.TIMESTAMP,'%Y') = '{post.Time}'",
                        _ => ""
                    };
                    string sql = @$"SELECT 
                        c.Name AS 'CityName',
                        a.Name AS 'AreaName',
                        ps.Name AS 'PowerstationName',
                        ps.SiteDB AS 'PowerstationDB',
                        ps.SolarType AS 'PowerstationType',
                        ps.Id as 'PowerStationId',
                        n.*
                        FROM power_station ps 
                        LEFT JOIN city c ON c.Id = ps.CityId
                        LEFT JOIN area a ON a.Id = ps.AreaId
                        left JOIN 
                        (
	                        SELECT a.SolarHour ,a.Kwh ,b.PR AvgPR,b.KWHKWP AvgKWHKWP,c.Irradiance AvgIrradiance,b.TodayMoney as 'TodayMoney',a.Id,a.time FROM 
	                        (
	                           SELECT ps.Id,SUM(k.SolarHour) SolarHour,SUM(k.Kwh) Kwh , k.time  FROM power_station ps 
		                        LEFT JOIN 
		                        (
			                        SELECT Max(ps.SOLARHOUR) AS 'SolarHour',MAX(ps.TODAYKWH) 'Kwh' ,DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d %H:%i') AS 'time', ps.PowerStationId
			                        FROM power_station_history_hour ps 
			                        WHERE ps.PowerStationId IN @ids {wheretime}
			                        GROUP BY DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d'),ps.PowerStationId 
		                        ) k ON k.PowerStationId = ps.Id WHERE ps.Id IN @ids GROUP BY k.PowerStationId 
	                        ) a
	                        LEFT JOIN 
	                        (
	                           SELECT ps.Id,AVG(n.PR) PR,AVG(n.KWHKWP) KWHKWP,SUM(n.TodayMoney) TodayMoney FROM power_station ps
		                        LEFT JOIN 
		                        (
			                        SELECT B.PR ,B.KWHKWP,B.TODAYMONEY AS 'TodayMoney', DATE_FORMAT(A.bb,'%Y-%m-%d') 'time' ,B.PowerStationId FROM
			                        (
			                           SELECT Max(ps.TIMESTAMP) AS bb FROM power_station_history_hour ps 
			                           WHERE ps.PowerStationId IN @ids {wheretime}
			                           GROUP BY DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d'),ps.PowerStationId 
			                        ) A 
			                        LEFT JOIN power_station_history_hour B ON A.bb = B.TIMESTAMP 
			                        GROUP BY B.PowerStationId ,DATE_FORMAT(A.bb,'%Y-%m-%d')
		                        )n ON ps.Id = n.PowerStationId WHERE ps.Id IN @ids GROUP BY n.PowerStationId  
	                        ) b
	                        ON a.Id = b.Id
	                        LEFT JOIN 
	                        (
	                           SELECT SUM(ps.Irradiance) AS Irradiance , DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d') AS TIME ,ps.PowerStationId
	                           from sensor_history_hour ps 
	                           WHERE ps.PowerStationId IN @ids {wheretime}
	                           GROUP BY DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d'),ps.PowerStationId
	                        ) c
	                        ON a.Id = c.PowerStationId
	                        GROUP BY a.Id,a.time
                        ) n ON n.Id = ps.Id
                        WHERE ps.Id IN @ids ORDER BY ps.CityId";
                    result = (await conn.QueryAsync<MaxFormbody>(sql,new { ids = ids})).ToList();
                }
                catch (Exception exception)
                {
                    throw exception;
                }
                finally
                {
                    conn.Close();
                }
                return result;
            }
        }

        public async Task<dynamic> Findhaveinv(Select_table post)
        {
            using (IDbConnection conn = _databaseHelper.GetConnection())
            {
                dynamic a;
                conn.Open();
                try
                {
                    string sql = "";
                    switch (post.FormType)
                    {
                        case 0:
                            sql = @$"
                            SET @sql = NULL;
                            SELECT
                                GROUP_CONCAT(DISTINCT
                                CONCAT('max(case when INVERTERID = ''', INVERTERID, ''' then a.KWH end) ''inv_', right(INVERTERID, 4), '''')
                                ) INTO @sql
                            FROM inverter_history_hour where powerstationId = {post.PowerStation};
                            SET @sql = CONCAT('SELECT DATE_FORMAT(a.TIMESTAMP,''%m-%d %H'') report_date, ', @sql, 
                                    ', b.KWH hourKWH, round((b.KWH / (SELECT MAX(TODAYKWH) FROM power_station_history_hour WHERE DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}'' and powerstationid = {post.PowerStation}))*100,2) ''hourKWHp'',  d.irradiance ''irradiance'', d.Temperature ''temperature'',
                                        b.money ''hourmoney'',  c.TODAYKWH ''totKWH'', c.KWHKWP ''totKWHKWP'', c.money ''totmoney'',  stationName, powerRate daymoney, c.SOLARHOUR tothour,round(b.PR, 2) as pr
                                    FROM inverter_history_hour a left join 
                                        ( # 每小時加總 inv 
                                        select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d %H:%i'') report_date, siteid, sitetype, round(KWH, 2) KWH, 
                                        round(TODAYKWH, 2) TODAYKWH,round(KWHKWP, 2) KWHKWP, round(PR, 2) PR, round(money, 2)  money 
                                        from power_station_history_hour
                                        where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}''
                                        ) b on a.powerStationid = b.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d %H:%i'') = b.report_date
                                        left join 
                                        ( # day
                                        select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') report_date, sitetype, round(TODAYKWH, 2) TODAYKWH,round(KWHKWP, 2) KWHKWP
                                        , round(PR, 2) PR, round(money, 2)  money , round(SOLARHOUR, 2) SOLARHOUR
                                        from power_station_history_day
                                        where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}''
                                        ) c on  a.powerStationid = c.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = c.report_date
                                        left join 
                                        (
                                        select powerStationID, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d %H:%i'')report_date, irradiance, Temperature  
                                        from sensor_history_hour  
                                        where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}''  
                                        ) d on  a.powerStationid = d.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d %H:%i'') = d.report_date
                                        join 
                                        (
                                        select id, name stationName, powerRate from power_station where id = {post.PowerStation}
                                        )z on a.powerstationid = z.id          
                                        where DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}''
                                        GROUP BY DATE_FORMAT(TIMESTAMP,''%Y-%m-%d %H:%i'')
                                        order by DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d %H:%i'') ');

                                        select  @sql as 'mySelect'; #顯示動態語法
                                        #PREPARE stmt FROM @sql; 
                                        #EXECUTE stmt;
                                        #DEALLOCATE PREPARE stmt;";
                            break;
                        case 1:
                            if (post.SearchType == 2)
                            {
                                sql = @$"
                                SET @sql = NULL;
                                SELECT
                                  GROUP_CONCAT(DISTINCT
                                    CONCAT('max(case when INVERTERID = ''', INVERTERID, ''' then round(a.KWH, 2) end) ''inv_', right(INVERTERID, 4), '''')
                                  ) INTO @sql
                                FROM inverter_history_hour where powerstationId = {post.PowerStation};
                                SET @sql = CONCAT('SELECT DATE_FORMAT(a.TIMESTAMP,''%m/%d'') report_date, ', @sql, 
                                         ',b.TODAYKWH ''dayKWH'', round((b.TODAYKWH / c.monthKWH)*100,2) ''dayKWHp'', b.SOLARHOUR ''tothour'',  b.KWHKWP ''KWHKWP'', b.PR,
                                  d.irradiance ''irradiance'', d.Temperature ''temperature'', b.money ''soldmoney'', 
                                 c.monthKWH ''monthKWH'', c.money ''monthmoney'',  stationName, powerRate ''monthmoneyone'',SolarType,SiteDB
                                         FROM inverter_history_day a left join 
                                          ( # 每日加總 inv 
                                           select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') report_date, siteid, sitetype, #, round(KWH, 2) KWH, 
                                             round(todayKWH, 2) todayKWH,round(KWHKWP, 2) KWHKWP, round(PR, 2) PR, ifnull(round(money, 2),0) money, round(SOLARHOUR, 2) SOLARHOUR
                                           from power_station_history_day
                                           where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m'') = ''{post.Time}''  
                                          ) b on a.powerStationid = b.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = b.report_date
                                          left join 
                                          ( # month
                                           select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m'') report_date, sitetype, round(monthKWH, 2) monthKWH,round(KWHKWP, 2) KWHKWP
                                           , round(PR, 2) PR, round(money, 2)  money , round(SOLARHOUR, 2) SOLARHOUR
                                           from power_station_history_month
                                           where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m'') = ''{post.Time}''
                                          ) c on  a.powerStationid = c.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m'') = c.report_date
                                          left join 
                                          (
                                           select powerStationID, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'')report_date, irradiance, Temperature  
                                           from sensor_history_day
                                           where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m'') = ''{post.Time}''  
                                          ) d on  a.powerStationid = d.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = d.report_date
                                          join 
                                          (
                                           select id, name stationName, powerRate,SolarType,SiteDB from power_station where id = {post.PowerStation}
                                          )z on a.powerstationid = z.id          
                                          where DATE_FORMAT(a.TIMESTAMP,''%Y-%m'') = ''{post.Time}''
                                          GROUP BY DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'')
                                          order by DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'')  ');

                                select  @sql as 'mySelect'; #顯示動態語法
                                        #PREPARE stmt FROM @sql; 
                                        #EXECUTE stmt;
                                        #DEALLOCATE PREPARE stmt;";
                            }
                            else
                            {
                                var times = post.Time.Replace('-', 'a').Replace('/', '-').Replace(" ", "").Split('a');

                                sql = @$"SET @sql = NULL;
                                    SELECT
                                      GROUP_CONCAT(DISTINCT
                                        CONCAT('max(case when INVERTERID = ''', INVERTERID, ''' then round(a.KWH, 2) end) ''inv_', right(INVERTERID, 4), '''')
                                      ) INTO @sql
                                    FROM inverter_history_hour where powerstationId = {post.PowerStation};
                                SET @sql = CONCAT('SELECT DATE_FORMAT(a.TIMESTAMP,''%m/%d'') report_date, ', @sql, 
                                         ',b.TODAYKWH ''dayKWH'', round((b.TODAYKWH / c.monthKWH)*100,2) ''dayKWHp'', b.SOLARHOUR ''tothour'',  b.KWHKWP ''KWHKWP'', b.PR,
                                  d.irradiance ''irradiance'', d.Temperature ''temperature'', b.money ''soldmoney'', 
                                 c.monthKWH ''monthKWH'', c.money ''monthmoney'',  stationName, powerRate ''monthmoneyone'',SolarType,SiteDB
                                         FROM inverter_history_day a left join 
                                              ( # 每日加總 inv 
                                               select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') report_date, siteid, sitetype, #, round(KWH, 2) KWH, 
                                                 round(todayKWH, 2) todayKWH,round(KWHKWP, 2) KWHKWP, round(PR, 2) PR, ifnull(round(money, 2),0) money, round(SOLARHOUR, 2) SOLARHOUR
                                               from power_station_history_day
                                               where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}''
                                              ) b on a.powerStationid = b.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = b.report_date
                                              left join 
                                              ( # month
                                                SELECT powerStationid, ROUND(AVG(TODAYKWH),2) AS monthKWH,
		                                         ROUND(AVG(KWHKWP),2)  AS KWHKWP,
	  	                                         ROUND(AVG(PR),2) AS PR,
		                                         ROUND(SUM(MONEY),2) AS money,
		                                         ROUND(SUM(SOLARHOUR),2)  AS SOLARHOUR
                                         FROM power_station_history_day where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}''
                                              ) c on  a.powerStationid = c.powerStationid 
                                              left join 
                                              (
                                               select powerStationID, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'')report_date, irradiance, Temperature  
                                               from sensor_history_day
                                               where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}''
                                              ) d on  a.powerStationid = d.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = d.report_date
                                              join 
                                              (
                                               select id, name stationName, powerRate, SolarType, SiteDB   from power_station where id = {post.PowerStation}
                                              )z on a.powerstationid = z.id          
                                              where DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}''
                                              GROUP BY DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'')
                                              order by DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'')  ');

                                    select  @sql as 'mySelect'; #顯示動態語法
                                        #PREPARE stmt FROM @sql; 
                                        #EXECUTE stmt;
                                        #DEALLOCATE PREPARE stmt;";
                            }

                            break;
                    }
                    a = await conn.QueryAsync<dynamic>(sql);
                }
                catch (Exception exception)
                {
                    throw exception;
                }
                finally
                {
                    conn.Close();
                }
                return a;
            }
        }
    }
}
