using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;

namespace SicboSub.StartProcedure
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.OutputEncoding = System.Text.Encoding.UTF8; // Hỗ trợ hiển thị tiếng Việt
            Console.WriteLine("=== TIẾN TRÌNH TÍNH TOÁN BXH SICBO ===");

            // 1. Cấu hình (Configuration)
            IConfiguration config = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .Build();

            string connectionString = config.GetConnectionString("DefaultConnection") 
                                   ?? "Data Source=YOUR_DB_HOST:1521/YOUR_SERVICE_NAME;User Id=YOUR_USER;Password=YOUR_PASSWORD;";

            var service = new RankingService(connectionString);

            // 2. Phân tích tham số đầu vào hoặc Chạy mặc định
            // Cách dùng: 
            //   SicboSub.StartProcedure.exe daily
            //   SicboSub.StartProcedure.exe monthly
            //   SicboSub.StartProcedure.exe 2025-01-18 daily

            DateTime targetDate = DateTime.Now.AddDays(-1); // Mặc định: Ngày hôm qua
            string mode = "DAILY";

            if (args.Length > 0)
            {
                if (args[0].ToUpper() == "DAILY") mode = "DAILY";
                else if (args[0].ToUpper() == "MONTHLY") mode = "MONTHLY";
                else if (DateTime.TryParse(args[0], out DateTime parsedDate)) targetDate = parsedDate;

                if (args.Length > 1)
                {
                   if (args[1].ToUpper() == "DAILY") mode = "DAILY";
                   else if (args[1].ToUpper() == "MONTHLY") mode = "MONTHLY";
                }
            }

            Console.WriteLine($"Chế độ chạy: {(mode == "DAILY" ? "Hàng Ngày" : "Hàng Tháng")}");
            Console.WriteLine($"Ngày mục tiêu: {targetDate:yyyy-MM-dd}");

            // 3. Thực thi
            if (mode == "DAILY")
            {
                await service.ExecuteDailyRankingAsync(targetDate);
            }
            else if (mode == "MONTHLY")
            {
                // Đối với chạy Tháng, Procedure sẽ lấy ngày truyền vào để xác định tháng.
                // VD: 14/01/2026 -> Sẽ tính cho Tháng 1/2026.
                // Nếu muốn tính tháng trước, cần đảm bảo targetDate thuộc về tháng trước.
                await service.ExecuteMonthlyRankingAsync(targetDate);
            }

            Console.WriteLine("Nhấn phím bất kỳ để thoát...");
            // Console.ReadKey(); // Bỏ comment nếu chạy bằng tay để xem kết quả
        }
    }
}
