@using AIStudio.Tools
@using MudBlazor

<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)</MudText>
        </CardHeaderContent>
        <CardHeaderActions>
            @if (this.IsSecondToLastBlock && this.Role is ChatRole.USER && this.EditLastUserBlockFunc is not null)
            {
                <MudTooltip Text="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="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="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="Removes this block" Placement="Placement.Bottom">
                    <MudIconButton Icon="@Icons.Material.Filled.Delete" Color="Color.Error" OnClick="@this.RemoveBlock"/>
                </MudTooltip>
            }
            <MudTooltip Text="Copies the content to the clipboard" Placement="Placement.Bottom">
                <MudIconButton Icon="@Icons.Material.Filled.ContentCopy" Color="Color.Default" OnClick="@this.CopyToClipboard"/>
            </MudTooltip>
        </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
                                </MudText>
                            }
                            else
                            {
                                <MudMarkdown Value="@textContent.Text" OverrideHeaderTypo="@Markdown.OverrideHeaderTypo" CodeBlockTheme="@this.CodeColorPalette"/>
                            }
                        }
                    }

                    break;

                case ContentType.IMAGE:
                    if (this.Content is ContentImage { SourceType: ContentImageSource.URL or ContentImageSource.LOCAL_PATH } imageContent)
                    {
                        <MudImage Src="@imageContent.Source"/>
                    }

                    break;

                default:
                    <MudText Typo="Typo.body2">
                        Cannot render content of type @this.Type yet.
                    </MudText>
                    break;
            }
        }
    </MudCardContent>
</MudCard>