module Interviews.Helpers exposing (..)

import Config.CardFormat exposing (..)
import Config.Colour exposing (..)
import Config.Format exposing (..)
import Config.StrengthBar exposing (..)
import Config.ToolTip exposing (..)
import Effect exposing (Effect)
import Element as E exposing (..)
import Element.Background as B exposing (..)
import Element.Border as D
import Element.Font as F
import Html.Attributes as H exposing (style)
import Interviews.Types exposing (..)
import Layouts
import Page exposing (Page)
import Route exposing (Route)
import Shared
import View exposing (View)


interviewMaker : Interview -> Element msg
interviewMaker interview =
    row
        topLevelBox
        [ cardImageMaker (interviewImage interview) (interviewSocial interview)
        , cardMaker
            [ cardTitleMaker (interviewTitle interview)
            , cardFormatter
                [ cardContentSpacing
                    [ column
                        fieldSpacer
                        [ socialMaker interview
                        , appearanceTitle interview
                        , appearanceMaker interview
                        ]
                    ]
                ]
            ]
        ]


interviewMakerMobile : Interview -> Element msg
interviewMakerMobile interview =
    row
        topLevelBox
        [ column [] []
        , cardMaker
            [ cardTitleMaker (interviewTitle interview)
            , cardFormatter
                [ cardContentSpacing
                    [ column
                        fieldSpacer
                        [ row [ spacing 10 ]
                            [ cardImageMakerMobile (interviewImage interview) (interviewSocial interview)
                            , socialMaker interview
                            ]
                        , appearanceTitle interview
                        , appearanceMaker interview
                        ]
                    ]
                ]
            ]
        ]


interviewImage : Interview -> { src : String, description : String }
interviewImage interview =
    { src = "interviews/" ++ interview.interviewImage ++ ".png"
    , description = interview.interviewImage
    }


interviewTitle : Interview -> String
interviewTitle interview =
    interview.interviewName


interviewSocial : Interview -> String
interviewSocial interview =
    interview.interviewSocial


socialMaker : Interview -> Element msg
socialMaker interview =
    paragraph
        (paragraphBoldFormat
            ++ [ F.size 18
               , spacing 5
               ]
        )
        [ text "Social: "
        , paragraphLinkFormat
            { url = interview.interviewSocial
            , label = transitionHighlightedLinkHover <| text (formatInterviewSocial interview.interviewSocial)
            }
        ]


appearanceTitle : Interview -> Element msg
appearanceTitle interview =
    paragraph
        (paragraphBoldFormat
            ++ [ F.size 18
               ]
        )
        [ text "Appearances: " ]


appearanceMaker : Interview -> Element msg
appearanceMaker interview =
    column [ spacing 15, width fill ] <|
        List.map2 (\x y -> makeAppearance x y)
            interview.interviewAppearances
            (List.range 1 (List.length interview.interviewAppearances))


makeAppearance : Appearance -> Int -> Element msg
makeAppearance appearanceEntry index =
    column
        (paragraphAlignLeft
            ++ [ spacing 8
               , width fill
               ]
        )
        [ row
            (paragraphFormat
                ++ [ F.size 18
                   , E.width fill
                   , paddingEach
                        { top = 0
                        , bottom = 0
                        , left = 35
                        , right = 0
                        }
                   ]
            )
            [ column
                (paragraphFormat
                    ++ [ F.size 18
                       , alignTop
                       , alignRight
                       , F.alignRight
                       ]
                )
                [ text (String.fromInt index ++ ". ") ]
            , column
                [ spacing 8
                , width fill
                ]
                [ episodeMaker appearanceEntry
                , experienceMaker appearanceEntry
                , dateMaker appearanceEntry
                , subjectMaker appearanceEntry
                , subjectList appearanceEntry
                ]
            ]
        ]


episodeMaker : Appearance -> Element msg
episodeMaker appearanceEntry =
    paragraphLinkFormat
        { url = appearanceEntry.appearanceLink
        , label =
            paragraph
                [ F.size 18
                ]
                [ text ("#" ++ appearanceEntry.appearanceEpisode ++ ": " ++ appearanceEntry.appearanceTitle)
                    |> el
                        [ F.color colourTheme.textLightOrange
                        , mouseOver [ F.color colourTheme.textDarkOrange ]
                        , transitionStyle
                        ]
                ]
        }


experienceMaker : Appearance -> Element msg
experienceMaker appearanceEntry =
    row
        [ width fill
        , height fill
        ]
        [ column
            [ E.alignTop
            , E.alignLeft
            ]
            [ paragraph
                (paragraphBoldFormat
                    ++ [ F.size 18
                       , E.width fill
                       ]
                )
                [ el
                    [ tooltip
                        "This represents how pleasant it was to interact with the host(s)."
                    ]
                    (el
                        [ paddingEach
                            { top = 0
                            , right = 10
                            , bottom = 0
                            , left = 0
                            }
                        ]
                     <|
                        text "Pleasantness:"
                    )
                ]
            ]
        , barPadding
            [ barMaker getExperienceTooltip appearanceEntry.appearanceExperience ]
        ]


getExperienceTooltip : Int -> String
getExperienceTooltip num =
    case num of
        0 ->
            "Nightmare. Complete fucking cunt."

        1 ->
            "Toxic. Deliberately malicious."

        2 ->
            "Hostile. Consistently disruptive."

        3 ->
            "Belligerent. Consistently disrespectful."

        4 ->
            "Uncivil. Frequently dismissive."

        5 ->
            "Neutral. Unremarkable social interaction."

        6 ->
            "Civil. Slightly considerate."

        7 ->
            "Pleasant. Genuinely respectful."

        8 ->
            "Very kind. Consistently supportive."

        9 ->
            "Compassionate. Went out of their way."

        10 ->
            "Absolute angel. Perfectly empathetic."

        _ ->
            "Behavior level out of expected range."


dateMaker : Appearance -> Element msg
dateMaker appearanceEntry =
    row paragraphBoldFormat
        [ column
            [ alignTop
            ]
            [ text "Published:"
            ]
        , column
            [ alignTop
            , width fill
            ]
            [ paragraph
                [ F.regular
                , paddingEach
                    { top = 0
                    , right = 0
                    , bottom = 0
                    , left = 3
                    }
                ]
                [ text appearanceEntry.appearanceYear ]
            ]
        ]


subjectMaker : Appearance -> Element msg
subjectMaker appearanceEntry =
    paragraph paragraphBoldFormat
        [ column
            [ alignTop
            ]
            [ text "Subjects: "
            ]
        ]


subjectList : Appearance -> Element msg
subjectList appearanceEntry =
    paragraph
        [ spacing 8
        , width fill
        , paddingEach
            { top = 0
            , right = 0
            , bottom = 0
            , left = 25
            }
        ]
    <|
        List.map2 (\x y -> makeSubject x)
            appearanceEntry.appearanceSubjects
            (List.range 1 (List.length appearanceEntry.appearanceSubjects))


makeSubject : Subjects -> Element msg
makeSubject subjects =
    paragraph
        [ E.width fill
        , alignLeft
        , paddingEach
            { top = 0
            , right = 0
            , bottom = 0
            , left = 8
            }
        ]
        [ paragraph [ F.regular ]
            [ text ("‣ " ++ subjects.subject) ]
        ]
