@using AIStudio.Tools
@using MudBlazor
@using AIStudio.Components
@inherits AIStudio.Components.MSGComponentBase

<MudCard Class="@this.CardClasses" Outlined="@true">
    <MudCardHeader>
        <CardHeaderAvatar>
            <MudAvatar Color="@this.Role.ToColor()">
                <MudIcon Icon="@this.Role.ToIcon()"/>
            </MudAvatar>
        </CardHeaderAvatar>
        <CardHeaderContent>
            <MudText Typo="Typo.body1">
                @this.Role.ToName() (@this.Time.LocalDateTime)
            </MudText>
        </CardHeaderContent>
        <CardHeaderActions>
            @if (this.Content.FileAttachments.Count > 0)
            {
                <MudTooltip Text="@T("Number of attachments")" Placement="Placement.Bottom">
                    <MudBadge Content="@this.Content.FileAttachments.Count" Color="Color.Primary" Overlap="true" BadgeClass="sources-card-header">
                        <MudIconButton Icon="@Icons.Material.Filled.AttachFile"
                                       OnClick="@this.OpenAttachmentsDialog"/>
                    </MudBadge>
                </MudTooltip>
            }
            @if (this.Content.Sources.Count > 0)
            {
                <MudTooltip Text="@T("Number of sources")" Placement="Placement.Bottom">
                    <MudBadge Content="@this.Content.Sources.Count" Color="Color.Primary" Overlap="true" BadgeClass="sources-card-header">
                        <MudIconButton Icon="@Icons.Material.Filled.Link"/>
                    </MudBadge>
                </MudTooltip>
            }
            @if (this.IsSecondToLastBlock && this.Role is ChatRole.USER && this.EditLastUserBlockFunc is not null)
            {
                <MudTooltip Text="@T("Edit")" Placement="Placement.Bottom">
                    <MudIconButton Icon="@Icons.Material.Filled.Edit" Color="Color.Default" OnClick="@this.EditLastUserBlock"/>
                </MudTooltip>
            }
            @if (this.IsLastContentBlock && this.Role is ChatRole.USER && this.EditLastBlockFunc is not null)
            {
                <MudTooltip Text="@T("Edit")" Placement="Placement.Bottom">
                    <MudIconButton Icon="@Icons.Material.Filled.Edit" Color="Color.Default" OnClick="@this.EditLastBlock"/>
                </MudTooltip>
            }
            @if (this.IsLastContentBlock && this.Role is ChatRole.AI && this.RegenerateFunc is not null)
            {
                <MudTooltip Text="@T("Regenerate")" Placement="Placement.Bottom">
                    <MudIconButton Icon="@Icons.Material.Filled.Recycling" Color="Color.Default" Disabled="@(!this.RegenerateEnabled())" OnClick="@this.RegenerateBlock"/>
                </MudTooltip>
            }
            @if (this.RemoveBlockFunc is not null)
            {
                <MudTooltip Text="@T("Removes this block")" Placement="Placement.Bottom">
                    <MudIconButton Icon="@Icons.Material.Filled.Delete" Color="Color.Error" OnClick="@this.RemoveBlock"/>
                </MudTooltip>
            }

            @if (this.Role is ChatRole.AI)
            {
                <MudTooltip Text="@T("Export Chat to Microsoft Word")" Placement="Placement.Bottom">
                    <MudIconButton Icon="@Icons.Material.Filled.Save" OnClick="@this.ExportToWord"/>
                </MudTooltip>
            }
            <MudCopyClipboardButton Content="@this.Content" Type="@this.Type" Size="Size.Medium"/>
        </CardHeaderActions>
    </MudCardHeader>
    <MudCardContent>
        @if (!this.HideContent)
        {
            if (this.Content.IsStreaming)
            {
                <MudProgressLinear Color="Color.Primary" Indeterminate="true" Class="mb-6" />
            }
            
            switch (this.Type)
            {
                case ContentType.TEXT:
                    if (this.Content is ContentText textContent)
                    {
                        if (textContent.InitialRemoteWait)
                        {
                            <MudSkeleton Width="30%" Height="42px;"/>
                            <MudSkeleton Width="80%"/>
                            <MudSkeleton Width="100%"/>
                        }
                        else
                        {
                            @if (this.Content.IsStreaming)
                            {
                                <MudText Typo="Typo.body1" Style="white-space: pre-wrap;">
                                    @textContent.Text.RemoveThinkTags()
                                </MudText>
                            }
                            else
                            {
                                <MudMarkdown Value="@textContent.Text.RemoveThinkTags().Trim()" Props="Markdown.DefaultConfig" Styling="@this.MarkdownStyling" />
                                @if (textContent.Sources.Count > 0)
                                {
                                    <MudMarkdown Value="@textContent.Sources.ToMarkdown()" Props="Markdown.DefaultConfig" Styling="@this.MarkdownStyling" />
                                }
                            }
                        }
                    }

                    break;

                case ContentType.IMAGE:
                    if (this.Content is ContentImage imageContent)
                    {
                        var imageSrc = imageContent.SourceType switch
                        {
                            ContentImageSource.BASE64 => ImageHelpers.ToDataUrl(imageContent.Source),
                            ContentImageSource.URL => imageContent.Source,
                            ContentImageSource.LOCAL_PATH => imageContent.Source,
                            
                            _ => string.Empty
                        };

                        if (!string.IsNullOrWhiteSpace(imageSrc))
                        {
                            <MudImage Src="@imageSrc" />
                        }
                    }

                    break;

                default:
                    <MudText Typo="Typo.body2">
                        @string.Format(T("Cannot render content of type {0} yet."), this.Type)
                    </MudText>
                    break;
            }
        }
    </MudCardContent>
</MudCard>