using economy.Models;
using Microsoft.EntityFrameworkCore;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

// HttpClient 사용
builder.Services.AddHttpClient<DataGoKR>();
builder.Services.AddHttpClient<FlowerAtOrKR>();
builder.Services.AddHttpClient<KoreaEximGoKR>();
builder.Services.AddHttpClient<DhlotteryCoKR>();
builder.Services.AddHttpClient<FIFA_API>();
builder.Services.AddHttpClient<NTS_API>();
builder.Services.AddHttpClient<Alpha_API>();

builder.Services.AddMemoryCache();

// DB 연결
builder.Services.AddDbContext<EconomyContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // 인코딩 등록

var app = builder.Build();

// economy database bootstrap (creates once on first run)
try
{
    var masterCsb = new Microsoft.Data.SqlClient.SqlConnectionStringBuilder(builder.Configuration.GetConnectionString("DefaultConnection")) { InitialCatalog = "master" };
    using var masterConn = new Microsoft.Data.SqlClient.SqlConnection(masterCsb.ConnectionString);
    masterConn.Open();
    using var createDbCmd = masterConn.CreateCommand();
    createDbCmd.CommandText = "IF DB_ID(N'economy') IS NULL CREATE DATABASE economy;";
    createDbCmd.ExecuteNonQuery();
}
catch (Exception e)
{
    Console.WriteLine($"Database init error: {e.Message}");
}

// ApiCache table bootstrap (creates once; app still boots if DB is down)
using (var scope = app.Services.CreateScope())
{
    try
    {
        var context = scope.ServiceProvider.GetRequiredService<EconomyContext>();
        context.Database.ExecuteSqlRaw("IF OBJECT_ID(N'dbo.ApiCache', N'U') IS NULL CREATE TABLE dbo.ApiCache (CacheKey NVARCHAR(100) NOT NULL PRIMARY KEY, Payload NVARCHAR(MAX) NOT NULL, UpdatedAt DATETIME2 NOT NULL);");
    }
    catch (Exception e)
    {
        Console.WriteLine($"ApiCache init error: {e.Message}");
    }
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();
