using Blahblah.FlowerStory.Server.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace Blahblah.FlowerStory.Server;

/// <inheritdoc/>
public class Program
{
    /// <inheritdoc/>
    public const string ProjectName = "Flower Story";
    /// <inheritdoc/>
    public const string Version = "0.7.731";

    /// <inheritdoc/>
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

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

        // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
        builder.Services.AddEndpointsApiExplorer();
        builder.Services.AddSwaggerGen(options =>
        {
            options.OperationFilter<SwaggerHttpHeaderOperation>();

            var scheme = new OpenApiSecurityScheme
            {
                Description = "ÊÚȨͷ¡£ ʾÀý£º \"RF4mfoUur0vHtWzHwD42ka0FhIfGaPnBxoQgrXOYEDg=\"",
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "Authorization"
                },
                Scheme = "oauth2",
                Name = "Authorization",
                In = ParameterLocation.Header,
                Type = SecuritySchemeType.ApiKey
            };
            options.AddSecurityDefinition("Authorization", scheme);
            options.AddSecurityRequirement(new OpenApiSecurityRequirement
            {
                [scheme] = Array.Empty<string>()
            });

            options.SwaggerDoc(Version, new OpenApiInfo
            {
                Title = ProjectName,
                Version = Version,
                Description = "<p>»¨Ê¼Ç¼£¬ÌùÐĵİïÄú¼Ç¼»¨Ô°ÖеĵãµãµÎµÎ¡£</p><p><b>API Îĵµ</b></p>"
            });

            options.IncludeXmlComments(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Server.xml"), true);
        });

        builder.Services.AddDbContext<FlowerDatabase>(options => options.UseSqlite("DataSource=flower.db;Cache=Shared"));
        builder.Services.AddScoped<SwaggerGenerator>();

        var app = builder.Build();

        // Configure the HTTP request pipeline.
        //if (app.Environment.IsDevelopment())
        {
            app.UseSwagger();
            app.UseSwaggerUI(options =>
            {
                options.SwaggerEndpoint($"/swagger/{Version}/swagger.json", ProjectName);
            });
        }

        app.UseAuthorization();
        app.UseStaticFiles();
        app.MapControllers();

        app.Run();
    }
}

/// <inheritdoc/>
public class SwaggerHttpHeaderOperation : IOperationFilter
{
    /// <inheritdoc/>
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        switch (context.ApiDescription.RelativePath)
        {
            case "api/user/auth":
                operation.Parameters.Add(new OpenApiParameter
                {
                    Name = "X-ClientAgent",
                    Description = "¿Í»§¶Ë´úÀí",
                    In = ParameterLocation.Header,
                    Required = false,
                    Schema = new OpenApiSchema { Type = "string" }
                });
                operation.Parameters.Add(new OpenApiParameter
                {
                    Name = "X-DeviceId",
                    Description = "É豸 id",
                    In = ParameterLocation.Header,
                    Required = false,
                    Schema = new OpenApiSchema { Type = "string" }
                });
                break;
        }
    }
}