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

import Config.Data.Identity exposing (pageNames)
import Config.Helpers.Articles.Types exposing (References)
import Config.Helpers.Cards.Inner.Helpers exposing (detailFormat)
import Config.Helpers.Cards.Outer.Helpers exposing (cardMaker)
import Config.Helpers.Cards.Outer.Types as C
import Config.Helpers.Format exposing (..)
import Config.Helpers.Headers.Helpers exposing (..)
import Config.Helpers.Headers.Types exposing (Header)
import Config.Helpers.Markdown exposing (..)
import Config.Helpers.Response
    exposing
        ( pageList
        , topLevelContainer
        )
import Config.Helpers.StrengthBar
    exposing
        ( barMaker
        , barPadding
        )
import Config.Helpers.ToolTip exposing (..)
import Config.Helpers.Viewport exposing (resetViewport)
import Config.Pages.Blog.Types exposing (BlogArticle)
import Config.Pages.Contact.Types exposing (..)
import Config.Pages.Interviews.Types exposing (..)
import Config.Pages.Products.Types exposing (..)
import Config.Style.Colour.Helpers exposing (colourTheme)
import Config.Style.Transitions
    exposing
        ( hoverFontDarkOrange
        , transitionStyleFast
        , transitionStyleSlow
        )
import Effect exposing (Effect)
import Element as E exposing (..)
import Element.Background as B
import Element.Border as D
import Element.Font as F
import Html
import Html.Attributes as H exposing (style)
import Layouts
import Page exposing (Page)
import Route exposing (Route)
import Shared exposing (..)
import View exposing (View)


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

        _ ->
            articleImage article.articleImage
    , case article.hasTableOfContents of
        True ->
            renderDeviceMarkdown article.articleBody

        False ->
            renderDeviceMarkdownNoToc article.articleBody
    , case article.hasReferences of
        True ->
            articleReferences article

        False ->
            none
    , detailFormat column extraElements
    ]


articleReferences : BlogArticle -> Element msg
articleReferences article =
    column [ 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 colourTheme.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
