using LearningMaterialSystem.Data;
using LearningMaterialSystem.Models;
using LearningMaterialSystem.Services;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.EntityFrameworkCore;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews(options =>
{
    options.Filters.Add(new Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter());
});

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
    ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");

// Phiên bản MySQL/MariaDB: để trống → dùng MySQL 8.0.36 mặc định.
// Trên cPanel thường là MariaDB → đặt ví dụ: "10.11.6-mariadb" hoặc "10.6.16-mariadb" (xem phpMyAdmin / cPanel).
var serverVersionString = builder.Configuration["MySql:ServerVersion"];
var serverVersion = string.IsNullOrWhiteSpace(serverVersionString)
    ? new MySqlServerVersion(new Version(8, 0, 36))
    : ServerVersion.Parse(serverVersionString.Trim());

builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseMySql(connectionString, serverVersion));

builder.Services.AddScoped<INhatKyTruyCapService, NhatKyTruyCapService>();

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.LoginPath = "/Account/Login";
        options.LogoutPath = "/Account/Logout";
        options.AccessDeniedPath = "/Account/AccessDenied";
        options.ExpireTimeSpan = TimeSpan.FromHours(8);
        options.SlidingExpiration = true;
    });
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("BoPhanChuyenMon", p => p.RequireRole("BoPhanChuyenMon"));
    options.AddPolicy("GiangVien", p => p.RequireRole("GiangVien"));
    options.AddPolicy("SinhVien", p => p.RequireRole("SinhVien"));
});



var app = builder.Build();

app.UseSwagger();
app.UseSwaggerUI();

using (var scope = app.Services.CreateScope())
{
    var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
    db.Database.EnsureCreated();

    // Cập nhật bảng cũ (MySQL/MariaDB): thêm cột nếu chưa có — bỏ qua lỗi nếu cột đã tồn tại.
    TryAddColumn(db, "NguoiDungs", "TenDangNhap", "VARCHAR(256) NOT NULL DEFAULT ''");
    TryAddColumn(db, "NguoiDungs", "MatKhauHash", "VARCHAR(500) NOT NULL DEFAULT ''");
    TryAddColumn(db, "HocLieus", "NguoiDungId", "INT NULL");
    TryAddColumn(db, "HocLieus", "TrangThai", "VARCHAR(50) NOT NULL DEFAULT 'ChoDuyet'");

    if (!db.MonHocs.Any())
    {
        db.MonHocs.AddRange(
            new MonHoc { MaMon = "CNPM", TenMon = "Công nghệ phần mềm", MoTa = "Môn học về quy trình phát triển phần mềm" },
            new MonHoc { MaMon = "CSDL", TenMon = "Cơ sở dữ liệu", MoTa = "Môn học về thiết kế và quản trị CSDL" },
            new MonHoc { MaMon = "LTW", TenMon = "Lập trình Web", MoTa = "Môn học về phát triển ứng dụng web" });
        db.SaveChanges();
    }
}


if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

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

app.Run();

static void TryAddColumn(ApplicationDbContext db, string table, string column, string columnDefinition)
{
    if (!IsSafeMySqlIdentifier(table) || !IsSafeMySqlIdentifier(column))
        return;
    try
    {
        var sql = "ALTER TABLE `" + table + "` ADD COLUMN `" + column + "` " + columnDefinition;
        db.Database.ExecuteSqlRaw(sql);
    }
    catch
    {
        // Cột đã tồn tại hoặc bảng chưa có — bỏ qua
    }
}

static bool IsSafeMySqlIdentifier(string name) =>
    name.Length is > 0 and <= 64 && name.All(c => char.IsLetterOrDigit(c) || c == '_');
