namespace FlatRender.ContentSvc.Models.Requests;

// ── Taxonomy ─────────────────────────────────────────────────────────────────

public record CreateCategoryRequest(
    Guid? ParentId,
    string Name,
    string Slug,
    string? Description,
    string? ImageUrl,
    string? Icon,
    string? MetaTitle,
    string? MetaDescription,
    string? MetaKeywords,
    bool BotFollow,
    int Sort,
    bool IsActive
);

public record UpdateCategoryRequest(
    Guid? ParentId,
    string Name,
    string Slug,
    string? Description,
    string? ImageUrl,
    string? Icon,
    string? MetaTitle,
    string? MetaDescription,
    string? MetaKeywords,
    bool BotFollow,
    int Sort,
    bool IsActive
);

public record CreateTagRequest(
    string Name,
    string? LatinName,
    string Slug,
    string? AppliesToMode,
    bool IsActive
);

public record UpdateTagRequest(
    string Name,
    string? LatinName,
    string Slug,
    string? AppliesToMode,
    bool IsActive
);

public record CreateFontRequest(
    string Name,
    string? OriginalName,
    string? SystemName,
    string? Family,
    int? Weight,
    string? Style,
    string Direction,
    string? FileUrl,
    string? SampleImageUrl,
    bool IsPremium,
    bool IsActive,
    bool InstalledOnNodes,
    int Sort
);

public record UpdateFontRequest(
    string Name,
    string? OriginalName,
    string? SystemName,
    string? Family,
    int? Weight,
    string? Style,
    string Direction,
    string? FileUrl,
    string? SampleImageUrl,
    bool IsPremium,
    bool IsActive,
    bool InstalledOnNodes,
    int Sort
);

public record CreateMusicTrackRequest(
    string Name,
    string? Caption,
    string? Keywords,
    string Url,
    string? WaveformData,
    decimal DurationSec,
    int? Bpm,
    string? Genre,
    string? Mood,
    bool IsPremium,
    bool IsActive,
    int Sort
);

public record UpsertRouteRequest(
    string Slug,
    string? Name = null,
    string? Image = null,
    int Priority = 5,
    DateTime? LastDate = null
);

public record UpsertHomeEventRequest(
    string? Title,
    string? Subtitle,
    string? Description,
    string? Badge,
    string? BadgeClass,
    string? ButtonText,
    string? ButtonUrl,
    string? ButtonClass,
    string? Color,
    string? BackgroundColor,
    string? TextColor,
    string? Image,
    bool IsActive = true,
    int Sort = 0,
    DateTime? StartsAt = null,
    DateTime? EndsAt = null
);

public record UpdateMusicTrackRequest(
    string Name,
    string? Caption,
    string? Keywords,
    string Url,
    string? WaveformData,
    decimal DurationSec,
    int? Bpm,
    string? Genre,
    string? Mood,
    bool IsPremium,
    bool IsActive,
    int Sort
);

// ── Templates ────────────────────────────────────────────────────────────────

public record CreateContainerRequest(
    string Slug,
    string Name,
    string? Description,
    string? Keywords,
    string? NewsText,
    string? Image,
    string? Demo,
    string? FullDemo,
    string? MiniDemo,
    string? DemoScriptTag,
    bool IsPublished,
    bool IsPremium,
    bool IsMockup,
    string PrimaryMode,
    int Sort,
    List<Guid> CategoryIds,
    List<Guid> TagIds
);

public record UpdateContainerRequest(
    string Slug,
    string Name,
    string? Description,
    string? Keywords,
    string? NewsText,
    string? Image,
    string? Demo,
    string? FullDemo,
    string? MiniDemo,
    string? DemoScriptTag,
    bool IsPublished,
    bool IsPremium,
    bool IsMockup,
    string PrimaryMode,
    int Sort,
    List<Guid> CategoryIds,
    List<Guid> TagIds
);

public record ContainerListRequest(
    int Page = 1,
    int PageSize = 20,
    string? Search = null,
    Guid? CategoryId = null,
    string? TagSlug = null,
    bool? IsPublished = null,
    bool? IsPremium = null,
    string? Mode = null,
    string? Sort = "sort_date_desc"
);

public record CreateProjectRequest(
    Guid ContainerId,
    Guid? ProjectServerId,
    string Name,
    string? Description,
    string? Image,
    string? FullDemo,
    string? DemoScriptTag,
    string? DownloadLink,
    string? Folder,
    int OriginalWidth,
    int OriginalHeight,
    string? Aspect,
    decimal ProjectDurationSec,
    decimal? MinDurationSec,
    decimal? MaxDurationSec,
    int FreeFps,
    string ChooseMode,
    string Resolution,
    decimal VipFactor,
    string RenderAepComp,
    bool IsPublished,
    int Sort
);

public record UpdateProjectRequest(
    string Name,
    string? Description,
    string? Image,
    string? FullDemo,
    string? DemoScriptTag,
    string? DownloadLink,
    string? Folder,
    int OriginalWidth,
    int OriginalHeight,
    string? Aspect,
    decimal ProjectDurationSec,
    decimal? MinDurationSec,
    decimal? MaxDurationSec,
    int FreeFps,
    string ChooseMode,
    string Resolution,
    decimal VipFactor,
    string RenderAepComp,
    string? SharedLayerImage,
    string? SharedColorsSvg,
    string? SharedColorPresetsSvg,
    bool IsPublished,
    int Sort
);

// Partial update — only non-null fields are applied, so editing an aspect/resolution
// never wipes render/colour data that the full UpdateProjectRequest would require.
public record CreateAssetRequest(
    string Name,
    string? Kind,
    string Url,
    string? MinioKey,
    long? SizeBytes,
    int Sort = 0
);

public record SetAepRequest(
    string? AepFileUrl,
    string? AepMinioBucket,
    string? AepMinioKey,
    string? AepFileMd5,
    long? AepFileSizeBytes,
    string? RenderAepComp,
    string? Folder
);

public record PatchProjectRequest(
    string? Name,
    string? Description,
    string? Aspect,
    string? Resolution,
    string? ChooseMode,
    int? OriginalWidth,
    int? OriginalHeight,
    decimal? ProjectDurationSec,
    decimal? MinDurationSec,
    decimal? MaxDurationSec,
    int? FreeFps,
    bool? IsPublished,
    int? Sort,
    string? Image,
    string? FullDemo,
    string? SharedColorsSvg
);

// ── CMS ──────────────────────────────────────────────────────────────────────

public record CreateBlogRequest(
    string Slug,
    string Title,
    string? ShortDescription,
    string Content,
    string? MetaTitle,
    string? MetaDescription,
    string? MetaKeywords,
    bool IncludeInSiteMap,
    string? Image,
    string? Cover,
    string? AuthorDisplayName,
    bool IsPublished,
    DateTime? PublishDate,
    string Kind = "Blog"
);

public record UpdateBlogRequest(
    string Slug,
    string Title,
    string? ShortDescription,
    string Content,
    string? MetaTitle,
    string? MetaDescription,
    string? MetaKeywords,
    bool IncludeInSiteMap,
    string? Image,
    string? Cover,
    string? AuthorDisplayName,
    bool IsPublished,
    DateTime? PublishDate
);

public record BlogListRequest(
    int Page = 1,
    int PageSize = 20,
    string? Search = null,
    bool? IsPublished = null,
    string Kind = "Blog"
);

public record CreateCommentRequest(
    Guid? BlogId,
    Guid? ContainerId,
    Guid? ParentCommentId,
    string Content,
    decimal? Rate
);

public record CreateSlideRequest(
    string? Keyword,
    string? Title,
    string? Image,
    string? Parameter,
    string SlideType,
    DateTime? ExpireDate,
    int Sort,
    bool IsActive
);

public record UpdateSlideRequest(
    string? Keyword,
    string? Title,
    string? Image,
    string? Parameter,
    string SlideType,
    DateTime? ExpireDate,
    int Sort,
    bool IsActive
);

public record UpsertWebsiteSettingRequest(
    string Key,
    string Value,
    string? Description,
    bool IsSecret
);

public record CreateFavoriteFolderRequest(string Name, string? Description);
public record UpdateFavoriteFolderRequest(string Name, string? Description);
public record AddFavoriteContainerRequest(Guid ContainerId, Guid? FolderId, string? Note);
