using Microsoft.AspNetCore.Mvc;
using SVSim.Database.Models.Config;
using SVSim.Database.Services;
using SVSim.Database.Services.Guild;
using SVSim.EmulatedEntrypoint.Models.Dtos.Common;
using SVSim.EmulatedEntrypoint.Models.Dtos.Guild;
using SVSim.EmulatedEntrypoint.Models.Dtos.Requests;
namespace SVSim.EmulatedEntrypoint.Controllers;
/// /guild/* — 22 endpoints. See docs/api-spec/endpoints/post-login/guild-*.md.
[Route("guild")]
public sealed class GuildController : SVSimController
{
private readonly IGuildService _guild;
private readonly IGameConfigService _configs;
public GuildController(IGuildService guild, IGameConfigService configs)
{
_guild = guild;
_configs = configs;
}
[HttpPost("info")]
public async Task> Info([FromBody] BaseRequest _, CancellationToken ct)
{
if (!TryGetViewerId(out var viewerId)) return Unauthorized();
var cfg = _configs.Get();
var view = await _guild.GetMyGuildAsync(viewerId, ct);
var resp = new GuildInfoResponse
{
MaxMemberNum = cfg.MaxMemberNum,
MaxSubLeaderNum = cfg.MaxSubLeaderNum,
UsableStampList = cfg.UsableStampList.ConvertAll(i => i.ToString()),
};
if (view is null)
{
resp.GuildStatus = 0; // NOT_JOINING
}
else
{
resp.GuildStatus = 2; // JOINING — fully populated path lands in Task 7
// Task 7 populates `Guild`, JoinRequestCount, InviteCount.
}
return resp;
}
// ===== 21 remaining stubs — each returns the response DTO with defaults =====
[HttpPost("create")]
public Task> Create([FromBody] GuildCreateRequest req, CancellationToken ct) => Stub();
[HttpPost("breakup")]
public Task> Breakup([FromBody] BaseRequest _, CancellationToken ct) => Stub();
[HttpPost("update")]
public Task> Update([FromBody] GuildUpdateRequest req, CancellationToken ct)
=> Task.FromResult>(new GuildUpdateResponse());
[HttpPost("update_description")]
public Task> UpdateDescription([FromBody] GuildUpdateDescriptionRequest req, CancellationToken ct) => Stub();
[HttpPost("update_emblem")]
public Task> UpdateEmblem([FromBody] GuildUpdateEmblemRequest req, CancellationToken ct)
=> Task.FromResult>(new GuildUpdateResponse());
[HttpPost("search_guild")]
public Task> SearchGuild([FromBody] GuildSearchGuildRequest req, CancellationToken ct)
=> Task.FromResult>(new GuildSearchGuildResponse { List = new() });
[HttpPost("emblem_list")]
public Task> EmblemList([FromBody] BaseRequest _, CancellationToken ct)
=> Task.FromResult>(new GuildEmblemListResponse { EmblemList = new() });
[HttpPost("others_info")]
public Task> OthersInfo([FromBody] GuildOthersInfoRequest req, CancellationToken ct)
=> Task.FromResult>(new GuildOthersInfoResponse());
[HttpPost("friend_list")]
public Task> FriendList([FromBody] BaseRequest _, CancellationToken ct)
=> Task.FromResult>(new GuildFriendListResponse { Friends = new() });
[HttpPost("invite_user_list")]
public Task> InviteUserList([FromBody] BaseRequest _, CancellationToken ct)
=> Task.FromResult>(new GuildInviteUserListResponse { Users = new() });
[HttpPost("invited_guild_list")]
public Task> InvitedGuildList([FromBody] GuildInvitedGuildListRequest req, CancellationToken ct)
=> Task.FromResult>(new GuildInvitedGuildListResponse { List = new() });
[HttpPost("invite")]
public Task> Invite([FromBody] GuildInviteRequest req, CancellationToken ct) => Stub();
[HttpPost("cancel_invite")]
public Task> CancelInvite([FromBody] GuildCancelInviteRequest req, CancellationToken ct) => Stub();
[HttpPost("reject_invite")]
public Task> RejectInvite([FromBody] GuildRejectInviteRequest req, CancellationToken ct) => Stub();
[HttpPost("join")]
public Task> Join([FromBody] GuildJoinEndpointRequest req, CancellationToken ct)
=> Task.FromResult>(new GuildJoinResponse { GuildStatus = 0 });
[HttpPost("cancel_join_request")]
public Task> CancelJoinRequest([FromBody] GuildCancelJoinRequestRequest req, CancellationToken ct) => Stub();
[HttpPost("join_request_list")]
public Task> JoinRequestList([FromBody] GuildJoinRequestListRequest req, CancellationToken ct)
=> Task.FromResult>(new GuildJoinRequestListResponse { Users = new() });
[HttpPost("join_request_accept")]
public Task> JoinRequestAccept([FromBody] GuildJoinRequestAcceptRequest req, CancellationToken ct) => Stub();
[HttpPost("reject_join_request")]
public Task> RejectJoinRequest([FromBody] GuildRejectJoinRequestRequest req, CancellationToken ct) => Stub();
[HttpPost("leave")]
public Task> Leave([FromBody] BaseRequest _, CancellationToken ct) => Stub();
[HttpPost("remove")]
public Task> Remove([FromBody] GuildRemoveRequest req, CancellationToken ct) => Stub();
[HttpPost("change_role")]
public Task> ChangeRole([FromBody] GuildChangeRoleRequest req, CancellationToken ct)
=> Task.FromResult>(new GuildChangeRoleResponse { Members = new() });
private static Task> Stub() =>
Task.FromResult>(new EmptyResponse());
}