module IHP.IDE.CodeGen.View.NewAction where

import IHP.ViewPrelude
import IHP.IDE.ToolServer.Types
import IHP.IDE.CodeGen.Types
import IHP.IDE.CodeGen.View.Generators (renderPlan)

data NewActionView = NewActionView
    { NewActionView -> Either Text [GeneratorAction]
plan :: Either Text [GeneratorAction]
    , NewActionView -> Text
actionName :: Text
    , NewActionView -> Text
controllerName :: Text
    , NewActionView -> Text
applicationName :: Text
    , NewActionView -> Bool
doGenerateView :: Bool
    , NewActionView -> [Text]
controllers :: [Text]
    , NewActionView -> [Text]
applications :: [Text]
    }

instance View NewActionView where
    html :: (?context::ControllerContext, ?view::NewActionView) =>
NewActionView -> Html
html NewActionView { Bool
[Text]
Either Text [GeneratorAction]
Text
$sel:plan:NewActionView :: NewActionView -> Either Text [GeneratorAction]
$sel:actionName:NewActionView :: NewActionView -> Text
$sel:controllerName:NewActionView :: NewActionView -> Text
$sel:applicationName:NewActionView :: NewActionView -> Text
$sel:doGenerateView:NewActionView :: NewActionView -> Bool
$sel:controllers:NewActionView :: NewActionView -> [Text]
$sel:applications:NewActionView :: NewActionView -> [Text]
plan :: Either Text [GeneratorAction]
actionName :: Text
controllerName :: Text
applicationName :: Text
doGenerateView :: Bool
controllers :: [Text]
applications :: [Text]
.. } = [hsx|
        <div class="generators">
            <div class="container pt-5">
                <div class="code-generator new-script">
                    {if isEmpty then renderEmpty else renderPreview}
                    {unless isEmpty (renderPlan plan)}
                </div>
            </div>
        </div>
    |]
        where
            renderEmpty :: Html
renderEmpty = [hsx|<form method="POST" action={NewActionAction}>
                    <div class="d-flex">
                        {when (length applications /= 1) renderApplicationSelector}
                        <select 
                            name="controllerName"
                            class="form-control select2-simple"
                            size="1"
                        >
                            {renderControllerOptions}
                        </select>
                        <input
                            type="text"
                            name="name"
                            placeholder="Action name"
                            class="form-control"
                            autofocus="autofocus"
                            value={actionName}
                            />
                        <button class="btn btn-primary" type="submit">Preview</button>
                    </div>
                    <div class="generator-options">
                        <input
                            type="checkbox"
                            name="doGenerateView"
                            id="doGenerateView"
                            />
                        <label class="pl-1" for="doGenerateView">With View</label>
                    </div>
                </form>|]
            renderControllerOptions :: Html
renderControllerOptions = [Text] -> (Text -> Html) -> Html
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Text]
controllers (\Text
x -> [hsx|<option>{x}</option>|])
            renderApplicationOptions :: Html
renderApplicationOptions = [Text] -> (Text -> Html) -> Html
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Text]
applications (\Text
x -> [hsx|<option selected={x == applicationName}>{x}</option>|])
            renderApplicationSelector :: Html
renderApplicationSelector = [hsx|
                <select
                    name="applicationName"
                    class="form-control select2-simple"
                    size="1"
                >
                    {renderApplicationOptions}
                </select>|]
            renderPreview :: Html
renderPreview = [hsx|
                <form method="POST" action={CreateActionAction} class="d-flex">
                    <div class="object-name flex-grow-1">{controllerName}.{actionName}</div>

                    <input type="hidden" name="name" value={actionName}/>
                    <input type="hidden" name="controllerName" value={controllerName}/>
                    <input type="hidden" name="applicationName" value={applicationName}/>
                    <input type="hidden" name="doGenerateView" value={(if doGenerateView then "on" else "off") :: Text}/>

                    <button class="btn btn-primary" type="submit">Generate</button>
                </form>
                <div class="generator-options">
                    <form method="POST" action={NewActionAction}>
                        <input
                            type="checkbox"
                            name="doGenerateView"
                            id="doGenerateView"
                            checked = {doGenerateView}
                            onchange = "this.form.submit()"
                            />
                        <label class="pl-1" for="doGenerateView">With View</label>
                        <input type="hidden" name="name" value={actionName}/>
                        <input type="hidden" name="controllerName" value={controllerName}/>
                    </form>
                </div>
            |]

            isEmpty :: Bool
isEmpty = Text -> Bool
forall mono. MonoFoldable mono => mono -> Bool
null Text
actionName