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

import IHP.ViewPrelude
import IHP.IDE.SchemaDesigner.Types
import IHP.IDE.ToolServer.Types
import IHP.IDE.SchemaDesigner.View.Layout

data EditForeignKeyView = EditForeignKeyView
    { EditForeignKeyView -> [Statement]
statements :: [Statement]
    , EditForeignKeyView -> Text
tableName :: Text
    , EditForeignKeyView -> Text
columnName :: Text
    , EditForeignKeyView -> [Text]
tableNames :: [Text]
    , EditForeignKeyView -> Text
referenceTable :: Text
    , EditForeignKeyView -> Text
constraintName :: Text
    , EditForeignKeyView -> Text
onDelete :: Text
    }

instance View EditForeignKeyView where
    html :: (?context::ControllerContext, ?view::EditForeignKeyView) =>
EditForeignKeyView -> Html
html EditForeignKeyView { [Text]
[Statement]
Text
$sel:statements:EditForeignKeyView :: EditForeignKeyView -> [Statement]
$sel:tableName:EditForeignKeyView :: EditForeignKeyView -> Text
$sel:columnName:EditForeignKeyView :: EditForeignKeyView -> Text
$sel:tableNames:EditForeignKeyView :: EditForeignKeyView -> [Text]
$sel:referenceTable:EditForeignKeyView :: EditForeignKeyView -> Text
$sel:constraintName:EditForeignKeyView :: EditForeignKeyView -> Text
$sel:onDelete:EditForeignKeyView :: EditForeignKeyView -> Text
statements :: [Statement]
tableName :: Text
columnName :: Text
tableNames :: [Text]
referenceTable :: Text
constraintName :: Text
onDelete :: 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|
                <form method="POST" action={UpdateForeignKeyAction}>
                    <input type="hidden" name="tableName" value={tableName}/>
                    <input type="hidden" name="columnName" value={columnName}/>

                    <div class="form-group row">
                        <label class="col-sm-2 col-form-label">Reference Table:</label>
                        <div class="col-sm-10">
                            <select name="referenceTable" class="form-control select2" autofocus="autofocus">
                                {forEach tableNames renderTableNameSelector}
                            </select>
                        </div>
                    </div>

                    <div class="form-group row">
                        <label class="col-sm-2 col-form-label">Name:</label>
                        <div class="col-sm-10">
                            <input name="constraintName" type="text" class="form-control" value={constraintName}/>
                        </div>
                    </div>

                    <div class="form-group row">
                        <label class="col-sm-2 col-form-label">On Delete:</label>
                        <div class="col-sm-10">
                            <select name="onDelete" class="form-control select2">
                                {onDeleteSelector "NoAction"}
                                {onDeleteSelector "Restrict"}
                                {onDeleteSelector "SetNull"}
                                {onDeleteSelector "SetDefault"}
                                {onDeleteSelector "Cascade"}
                            </select>
                        </div>
                    </div>

                    <div class="text-right">
                        <button type="submit" class="btn btn-primary">Edit Constraint</button>
                    </div>
                </form>
                {select2}
            |]
                where
                    renderTableNameSelector :: Text -> Html
renderTableNameSelector Text
tableName = if Text
tableName Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
referenceTable
                        then String -> Html
forall a. ToMarkup a => a -> Html
preEscapedToHtml [plain|<option selected>#{tableName}</option>|]
                        else String -> Html
forall a. ToMarkup a => a -> Html
preEscapedToHtml [plain|<option>#{tableName}</option>|]
                    onDeleteSelector :: Text -> Html
onDeleteSelector Text
option = if Text
option Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
onDelete
                        then String -> Html
forall a. ToMarkup a => a -> Html
preEscapedToHtml [plain|<option selected>#{option}</option>|]
                        else String -> Html
forall a. ToMarkup a => a -> Html
preEscapedToHtml [plain|<option>#{option}</option>|]
                    select2 :: Html
select2 = String -> Html
forall a. ToMarkup a => a -> Html
preEscapedToHtml [plain|
                        <script>
                            $('.select2').select2();
                        </script>
                    |]
            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
"Edit Foreign Key Constraint"
            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 }