module Config.Helpers.Articles.Article exposing (..)

import Config.Data.Identity exposing (pageNames)
import Config.Helpers.Articles.Markdown as Markdown
    exposing
        ( articleImage
        , renderDeviceMarkdown
        , renderDeviceMarkdownNoToc
        )
import Config.Helpers.Articles.Types exposing (References)
import Config.Helpers.Cards.Inner.Text exposing (detailFormat)
import Config.Helpers.Viewport exposing (resetViewport)
import Config.Pages.Blogs.Types exposing (BlogArticle)
import Config.Style.Colour.Helpers
    exposing
        ( ThemeColor(..)
        , getThemeColor
        )
import Config.Style.Transitions
    exposing
        ( hoverFontDarkOrange
        , transitionStyleFast
        )
import Element as E exposing (..)
import Element.Background as B exposing (color)
import Element.Border as D exposing (width)
import Element.Font as F
    exposing
        ( alignLeft
        , bold
        , color
        , regular
        )
import Ports


contentList : BlogArticle -> List (Element msg) -> (Markdown.Msg -> msg) -> List (Element msg)
contentList article extraElements toMsg =
    [ case article.articleImage of
        "" ->
            none

        _ ->
            articleImage article.articleImage
    , case article.hasTableOfContents of
        True ->
            E.map toMsg (renderDeviceMarkdown article.articleBody)

        False ->
            E.map toMsg (renderDeviceMarkdownNoToc article.articleBody)
    , case article.hasReferences of
        True ->
            articleReferences article

        False ->
            none
    , detailFormat column extraElements
    ]


articleReferences : BlogArticle -> Element msg
articleReferences article =
    column [ E.width fill, F.size 15, spacing 10 ] <|
        List.map2 (\x y -> makeReference x y)
            article.articleReferences
            (List.range 1 (List.length article.articleReferences))


makeReference : References -> Int -> Element msg
makeReference references index =
    let
        comma =
            ", "
    in
    el
        [ F.regular
        , F.alignLeft
        ]
    <|
        paragraph []
            [ newTabLink
                [ F.bold
                , F.color (getThemeColor TextLightOrange)
                , hoverFontDarkOrange
                , transitionStyleFast
                ]
                { url = references.link, label = text (String.fromInt index ++ ". ") }
            , text (references.author ++ comma)
            , text (references.title ++ comma)
            , text (references.journal ++ comma)
            , text references.year
            ]


extractFirstWords : String -> String
extractFirstWords text =
    let
        words =
            text
                |> String.split " "
                |> List.filter (not << String.isEmpty)

        truncatedWords =
            List.take 80 words

        wasTextTruncated =
            List.length words > 80

        result =
            String.join " " truncatedWords
    in
    if wasTextTruncated then
        result ++ "..."

    else
        result
