module PruebasDibujos
  ( testElemento,
    testBase,
    testBarraBasica,
    testBarraBasicaPulsada,
    testBarra1Boton,
    testBotonBasico,
    testBotonPulsado,
    testEntradaBasica,
    testEntradaTransparente,
    testEtiqueta,
    testLista,
    testParrafo,
    testSaltoDeLineaBasico,
    testSaltoDeLineaVertical,
    testTituloBasico,
    testTituloBasico2,
    testTituloBasico3,
    testTituloBasico4,
    testTituloBasico5,
    testTituloBasico6,
    testTituloBasico7,
  )
where

import AlmacenElementos as Al
import DatosElementosPreconstruidos as Dep
import Graphics.Gloss.Interface.Pure.Display (Display (InWindow), blue, display, white)
import Tipos.TipoBarraNavegacion as Barra
import Tipos.TipoBase as B
import Tipos.TipoElemento as E
import Tipos.TipoEntrada as E
import Tipos.TipoEtiqueta as Et
import Tipos.TipoForma as F
import Tipos.TipoLista as L
import Tipos.TipoParrafo as P
import Tipos.TipoPosicion (Malla)
import Tipos.TipoSaltoDeLinea as S
import Tipos.TipoTitulo as T
import Utilidades.Constantes (posicionVentana, tamañoVentana)
import Utilidades.Utiles (cabeza)

-- Definiciones básicas

ventana :: Display
ventana = InWindow "Automata" tamañoVentana posicionVentana

almacen :: Al.AlmacenElementos
almacen = snd $ Al.construyeAlmacen [] almacenBasico

mallaBasica :: Malla
mallaBasica = B.creaMallaBase $ cabeza "mallaBasica" $ Al.bases almacen

elemento :: E.Elemento
elemento = snd $ E.construyeElemento [] Dep.elementoBasico

base :: B.Base
base = cabeza "base" $ Al.bases almacen

barra :: Barra.BarraNavegacion
barra = cabeza "barra" $ Al.barrasNavegacion almacen

boton :: F.Forma
boton = cabeza "boton" $ Al.formas almacen

entrada :: E.Entrada
entrada = cabeza "entrada" $ Al.entradas almacen

etiqueta :: Et.Etiqueta
etiqueta = cabeza "etiqueta" $ Al.etiquetas almacen

lista :: L.Lista
lista = cabeza "lista" $ Al.listas almacen

parrafo :: P.Parrafo
parrafo = cabeza "parrafo" $ Al.parrafos almacen

saltoDeLinea :: S.SaltoDeLinea
saltoDeLinea = cabeza "saltoDeLinea" $ Al.saltosDeLinea almacen

titulo :: T.Titulo
titulo = cabeza "titulo" $ Al.titulos almacen

-- Tests

-- +++++++++++++ Elemento +++++++++++++++++++++++++++++++
testElemento :: IO ()
testElemento = do
  print $ "elementoBasico: " ++ show elemento

-- +++++++++++++ Base +++++++++++++++++++++++++++++++
testBase :: IO ()
testBase = do
  print $ "baseBasica: " ++ show base
  print "\nMalla basica de la baseBasica:"
  print mallaBasica

-- +++++++++++++ Barra +++++++++++++++++++++++++++++++
testBarraBasica :: IO ()
testBarraBasica = do
  barraDibujada <- Barra.dibujaBarraNavegacion barra
  print $ "\nBarra basica: " ++ show barra
  display ventana white barraDibujada

testBarraBasicaPulsada :: IO ()
testBarraBasicaPulsada = do
  barraDibujada <- Barra.dibujaBarraNavegacion $ barra {Barra.datosElemento = elemento {E.pulsado = True}}
  print $ "\nBarra basica: " ++ show barra
  display ventana white barraDibujada

testBarra1Boton :: IO ()
testBarra1Boton = do
  barraDibujada <- Barra.dibujaBarraNavegacion $ barra {Barra.formas = [PruebasDibujos.boton]}
  print $ "\nBarra con un boton: " ++ show barra {Barra.formas = [PruebasDibujos.boton]}
  display ventana white barraDibujada

-- +++++++++++++ Botón +++++++++++++++++++++++++++++++
testBotonBasico :: IO ()
testBotonBasico = do
  botonDibujado <- F.dibujaForma [] PruebasDibujos.boton
  print $ "Boton basico: " ++ show PruebasDibujos.boton
  display ventana white botonDibujado

testBotonPulsado :: IO ()
testBotonPulsado = do
  botonDibujado <- F.dibujaForma [] PruebasDibujos.boton
  print $ "Boton basico: " ++ show PruebasDibujos.boton {F.datosElemento = elemento {E.pulsado = True}}
  display ventana white botonDibujado

-- +++++++++++++ Entrada +++++++++++++++++++++++++++++++
testEntradaBasica :: IO ()
testEntradaBasica = do
  print $ "entradaBasica: " ++ show entrada
  entradaDibujada <- E.dibujaEntrada entrada
  print "\nEntrada basica:"
  display ventana white entradaDibujada

testEntradaTransparente :: IO ()
testEntradaTransparente = do
  print $ "entradaTransparente: " ++ show entrada {E.fondoTransparente = True}
  entradaDibujada <- E.dibujaEntrada $ entrada {E.fondoTransparente = True}
  print "\nEntrada transparente:"
  display ventana blue entradaDibujada

-- +++++++++++++ Etiqueta +++++++++++++++++++++++++++++++
testEtiqueta :: IO ()
testEtiqueta = do
  let esquinasPrueba = esquinas $ Et.datosElemento etiqueta
  print $ "etiquetaBasica: " ++ show etiqueta
  etiquetaDibujada <- Et.dibujaEtiqueta esquinasPrueba etiqueta
  display ventana white etiquetaDibujada

-- +++++++++++++ Lista +++++++++++++++++++++++++++++++
testLista :: IO ()
testLista = do
  print $ "listaBasica: " ++ show lista
  listaDibujada <- L.dibujaLista lista
  display ventana white listaDibujada

-- +++++++++++++ Párrafos +++++++++++++++++++++++++++++++
testParrafo :: IO ()
testParrafo = do
  print $ "parrafoBasico: " ++ show parrafo
  parrafoDibujado <- P.dibujaParrafo parrafo
  display ventana white parrafoDibujado

-- +++++++++++++ Saltos de línea +++++++++++++++++++++++++++++++
testSaltoDeLineaBasico :: IO ()
testSaltoDeLineaBasico = do
  print $ "saltoDeLineaBasico: " ++ show saltoDeLinea
  saltoDeLineaDibujado <- S.dibujaSaltoDeLinea saltoDeLinea
  display ventana white saltoDeLineaDibujado

testSaltoDeLineaVertical :: IO ()
testSaltoDeLineaVertical = do
  print $ "saltoDeLineaVertical: " ++ show saltoDeLinea {S.vertical = True}
  saltoDeLineaDibujado <- S.dibujaSaltoDeLinea $ saltoDeLinea {S.vertical = True}
  display ventana white saltoDeLineaDibujado

-- +++++++++++++ Títulos +++++++++++++++++++++++++++++++
testTituloBasico :: IO ()
testTituloBasico = do
  print $ "tituloBasico: " ++ show titulo
  tituloDibujado <- T.dibujaTitulo titulo
  display ventana white tituloDibujado

testTituloBasico2 :: IO ()
testTituloBasico2 = do
  print $ "tituloBasico2: " ++ show titulo {T.tamañoTitulo = 2, T.texto = "Texto 2"}
  tituloDibujado <- T.dibujaTitulo $ titulo {T.tamañoTitulo = 2, T.texto = "Texto 2"}
  display ventana white tituloDibujado

testTituloBasico3 :: IO ()
testTituloBasico3 = do
  print $ "tituloBasico3: " ++ show titulo {T.tamañoTitulo = 3, T.texto = "Texto 3"}
  tituloDibujado <- T.dibujaTitulo $ titulo {T.tamañoTitulo = 3, T.texto = "Texto 3"}
  display ventana white tituloDibujado

testTituloBasico4 :: IO ()
testTituloBasico4 = do
  print $ "tituloBasico4: " ++ show titulo {T.tamañoTitulo = 4, T.texto = "Texto 4"}
  tituloDibujado <- T.dibujaTitulo $ titulo {T.tamañoTitulo = 4, T.texto = "Texto 4"}
  display ventana white tituloDibujado

testTituloBasico5 :: IO ()
testTituloBasico5 = do
  print $ "tituloBasico5: " ++ show titulo {T.tamañoTitulo = 5, T.texto = "Texto 5"}
  tituloDibujado <- T.dibujaTitulo $ titulo {T.tamañoTitulo = 5, T.texto = "Texto 5"}
  display ventana white tituloDibujado

testTituloBasico6 :: IO ()
testTituloBasico6 = do
  print $ "tituloBasico6: " ++ show titulo {T.tamañoTitulo = 6, T.texto = "Texto 6"}
  tituloDibujado <- T.dibujaTitulo $ titulo {T.tamañoTitulo = 6, T.texto = "Texto 6"}
  display ventana white tituloDibujado

testTituloBasico7 :: IO ()
testTituloBasico7 = do
  print $ "tituloBasico7: " ++ show titulo {T.tamañoTitulo = 7, T.texto = "Texto 7"}
  tituloDibujado <- T.dibujaTitulo $ titulo {T.tamañoTitulo = 7, T.texto = "Texto 7"}
  display ventana white tituloDibujado