module IHP.IDE.SchemaDesigner.View.Columns.New where

import IHP.ViewPrelude
import IHP.IDE.SchemaDesigner.Types
import IHP.IDE.ToolServer.Types
import IHP.IDE.ToolServer.Routes ()
import IHP.IDE.SchemaDesigner.View.Layout
import IHP.IDE.SchemaDesigner.View.Columns.Edit (typeSelector)

data NewColumnView = NewColumnView
    { NewColumnView -> [Statement]
statements :: [Statement]
    , NewColumnView -> Text
tableName :: Text
    , NewColumnView -> [Text]
tableNames :: [Text]
    , NewColumnView -> [Text]
enumNames :: [Text]
    }

instance View NewColumnView where
    html :: (?context::ControllerContext, ?view::NewColumnView) =>
NewColumnView -> Html
html NewColumnView { [Text]
[Statement]
Text
$sel:statements:NewColumnView :: NewColumnView -> [Statement]
$sel:tableName:NewColumnView :: NewColumnView -> Text
$sel:tableNames:NewColumnView :: NewColumnView -> [Text]
$sel:enumNames:NewColumnView :: NewColumnView -> [Text]
statements :: [Statement]
tableName :: Text
tableNames :: [Text]
enumNames :: [Text]
.. } = [hsx|
        <div class="row no-gutters bg-white" id="schema-designer-viewer">
            {renderObjectSelector (zip [0..] statements) (Just tableName)}
            {renderColumnSelector tableName  (zip [0..] columns) statements}
        </div>
        {migrationStatus}
        {renderModal modal}
    |]
        where
            table :: Maybe Statement
table = Text -> [Statement] -> Maybe Statement
forall {t :: * -> *}.
Foldable t =>
Text -> t Statement -> Maybe Statement
findStatementByName Text
tableName [Statement]
statements
            columns :: [Column]
columns = [Column] -> (Statement -> [Column]) -> Maybe Statement -> [Column]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ((.columns) (CreateTable -> [Column])
-> (Statement -> CreateTable) -> Statement -> [Column]
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Statement -> CreateTable
unsafeGetCreateTable) Maybe Statement
table

            modalContent :: Html
modalContent = [hsx|
                {renderFlashMessages}
                <form method="POST" action={CreateColumnAction} id="new-column">
                    <input type="hidden" name="tableName" value={tableName}/>

                    <div class="form-group">
                        <input
                            id="colName"
                            name="name"
                            type="text"
                            class="form-control"
                            autofocus="autofocus"
                            placeholder="Name"
                            data-table-name-singular={singularize tableName}
                            />
                    </div>

                    <div class="form-group">
                        {typeSelector Nothing enumNames}
                        <div class="mt-1 text-muted" id="column-options">
                            {generateReferenceCheckboxes}
                            <div class="d-flex">
                                <div class="custom-control custom-checkbox">
                                    <input id="allowNull" type="checkbox" name="allowNull" class="mr-1 custom-control-input"/>
                                    <label class="custom-control-label mr-2" for="allowNull">
                                        Nullable
                                    </label>
                                </div>

                                <div class="custom-control custom-checkbox">
                                    <input type="checkbox" id="isUnique" name="isUnique" class="mr-1 custom-control-input"/>
                                    <label class="mx-2 custom-control-label" for="isUnique">
                                        Unique
                                    </label>
                                </div>

                                <div class="custom-control custom-checkbox">
                                    <input type="checkbox" name="primaryKey" id="primaryKey" class="mr-1 custom-control-input"/>
                                    <label class="mx-2 custom-control-label" for="primaryKey">
                                        Primary Key
                                    </label>
                                </div>

                                <div class="custom-control custom-checkbox">
                                    <input id="isArray" type="checkbox" name="isArray" class="mr-1 custom-control-input"/>
                                    <label class="mx-2 custom-control-label" for="isArray">
                                        Array Type
                                    </label>
                                </div>
                            </div>
                        </div>
                    </div>

                    <div class="form-group">
                        {defaultSelector}
                    </div>

                    <div class="text-right">
                        <button type="submit" class="btn btn-primary">Create Column</button>
                    </div>

                    <input type="hidden" name="primaryKey" value={inputValue False}/>
                    <input type="hidden" name="allowNull" value={inputValue False}/>
                    <input type="hidden" name="isUnique" value={inputValue False}/>
                    <input type="hidden" name="isArray" value={inputValue False}/>
                    <input type="hidden" name="isReference" value={inputValue False}/>
                    <input type="hidden" name="referenceTable" value=""/>
                </form>
            |]
                where
                    generateReferenceCheckboxes :: Html
generateReferenceCheckboxes = [Text] -> (Element [Text] -> Html) -> Html
forall mono (m :: * -> *).
(MonoFoldable mono, Applicative m) =>
mono -> (Element mono -> m ()) -> m ()
forEach [Text]
tableNames Element [Text] -> Html
Text -> Html
checkbox
                        where
                            checkbox :: Text -> Html
checkbox Text
tableName = [hsx|
                            <div>
                                <div class="custom-control custom-checkbox ref" style="display: none;" data-attribute={(singularize tableName) <> "_id"} data-table={tableName} >
                                    <input id={"checkbox-ref-" <> tableName} type="checkbox" name="isReference" class="mr-1 custom-control-input"/>
                                    <label for={"checkbox-ref-" <> tableName} class="mx-2 custom-control-label" id="refText">
                                        References {tableName}
                                    </label>
                                </div>
                            </div>
                            |]
                    defaultSelector :: Html
defaultSelector = [hsx|
                        <select id="defaultSelector" name="defaultValue" class="form-control select2">
                            <option value="" selected={True}>no default</option>
                            <option value="''">""</option>
                        </select>
                    |]
            modalFooter :: Maybe Html
modalFooter = Maybe Html
forall a. Monoid a => a
mempty
            modalCloseUrl :: Text
modalCloseUrl = TablesController -> Text
forall controller. HasPath controller => controller -> Text
pathTo ShowTableAction { Text
tableName :: Text
$sel:tableName:TablesAction :: Text
tableName }
            modalTitle :: Text
modalTitle = Text
"New Column"
            modal :: Modal
modal = Modal { Html
modalContent :: Html
$sel:modalContent:Modal :: Html
modalContent, Maybe Html
modalFooter :: Maybe Html
$sel:modalFooter:Modal :: Maybe Html
modalFooter, Text
modalCloseUrl :: Text
$sel:modalCloseUrl:Modal :: Text
modalCloseUrl, Text
modalTitle :: Text
$sel:modalTitle:Modal :: Text
modalTitle }