using MMoneyCoderSharp.Data.Request;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static MMoneyCoderSharp.DBDefine;

namespace MMoneyCoderSharp.DB
{
    /// <summary>
    /// 환율선그래프관련 DB데이터 쿼리매핑 오브젝트.
    /// 
    /// 오늘데이터를 가져오는 쿼리와 기존 데이터 목록을 가져오는 쿼리가 각각 정리되어있다.
    /// 선그래프등의 여러 데이터를 가져와야하는 쿼리의 경우 해당 쿼리를 union하여 더해서 리턴한다.
    /// </summary>
    internal class Exchange : ADataObject
    {
        
        public Exchange(환율 recvDataType, 데이터기간 recvDataLength)
        {

            this.dataType = recvDataType;
            this.dataLenght = recvDataLength;

        }

        /// <summary>
        /// 환율데이터 종류
        /// </summary>
        private 환율 dataType;

        /// <summary>
        /// 가져올 데이터 기간
        /// </summary>
        private 데이터기간 dataLenght;

        /// <summary>
        /// 누적데이터 쿼리
        /// </summary>
        const string queryLast = @"select 
                a.f_data_day data_day, 
                a.f_input_code input_code, 
                b.f_input_name, 
                a.f_curr_price curr_price, 
                a.F_net_CHG net_chg, 
                a.f_chg_type chg_type, 
                round((a.f_net_chg / decode(a.f_chg_type, '+', (a.f_curr_price - a.f_net_chg), '', (a.f_curr_price), '-', (a.f_curr_price + a.f_net_chg), 1)) * 100, 2) rate 
            from t_week_index a, t_input_code b 
            where a.f_input_code = b.f_input_code 
                and a.f_input_code = '{0}' 
                and a.f_data_day in ( 
                    select open_day 
                    from ( 
                        select open_day 
                        from v_open_day 
                        minus 
                        select f_data_day data_day 
                        from t_input_index 
                        where f_input_code = '{0}'
                        order by open_day desc 
                    ) 
                    where rownum < {1}
                ) 
            ";

        /// <summary>
        /// 금일 데이터 쿼리
        /// </summary>
        const string queryToday = @"SELECT 
                a.f_data_day data_day, 
                a.f_input_code input_code, 
                b.f_input_name input_name, 
                a.f_curr_price curr_price, 
                a.f_net_chg net_chg, 
                a.f_chg_type, 
                round((a.f_net_chg / decode(a.f_chg_type, '+', (a.f_curr_price - a.f_net_chg), '', (a.f_curr_price), '-', (a.f_curr_price + a.f_net_chg), 1)) * 100, 2) rate 
            FROM t_input_index a, t_input_code b 
            WHERE a.f_input_code = b.f_input_code 
                AND a.f_input_code = '{0}'
            order by data_day desc
            ";

        public override IDataRequest buildData()
        {

            string bufQuery = "";

            if (dataLenght != 데이터기간.일)
            {

                bufQuery += String.Format(queryLast, dataType.GetStringValue(), dataLenght.GetStringValue());

                bufQuery += " union ";

            }

            bufQuery += String.Format(queryToday, dataType.GetStringValue());

            mRequestQuery.Add("", bufQuery);

            return this;
        }
    }
}
