module Types where

  -- Name representa el nombre de una lista de peliculas.
  type Name = String
  
  -------------------------
  -- AST
  data Comm = Seq Comm Comm    -- secuencia de comandos
            | Def Name FList   -- define una lista
            | Add Name FList   -- operador << 
            | Rem Name FList   -- operador >>
            deriving Show

  -- Formato de la lista antes de ser evaluada.
  data FList = New Params      
             | And FList FList
             | Var Name 
             deriving Show

  -- Parametros a partir de los cuales pueden formarse las listas.
  -- Los parametros no especificados tomaran el valor por defecto de
  -- la API.
  data Params = P {  rate   :: Maybe Integer,
                     limit  :: Maybe Integer,
                     genre  :: Maybe String,
                     query  :: Maybe String,
                     sorted :: Maybe String,
                     order  :: Maybe String
                   } deriving Show


  -- El objetivo de AuxParams es simplemente hacer el parseo más fácil.
  -- La representación de los parámetros a partir de la cual se hará el
  -- request es el record de arriba de tipo Params
  -- Ver en Parser.hs 
  data AuxParams = Rating Integer
                 | Limit Integer
                 | Genre String
                 | Query String
                 | Sort String
                 | Order String
                 deriving Show
  -------------------------

  
  -- Lista de listas de peliculas
  type Env = [(Name, [Film])]

  -- Posibles errores durante la evaluación
  data Error = BadParams    -- ninguna película satisface los parámetros
             | Undef Name   -- lista no definida
             | IQuit        -- salir del interprete

  -- Estado que llevara el interprete. 
  data State = State { d_dir      :: String,             -- directorio donde guardar las descargas
                       lfile      :: String,             -- ultimo archivo cargado
                       list       :: Env,                -- lista con todas las listas de peliculas
                       dlist      :: [String]            -- pids de los procesos que están descargando
                     }                                      -- los represento como String para no tener que importar el modulo System.Process
                                                            -- también me sirve para facilitar la función stopDownload (ver en Download.hs)
                                                         


  -- Representacion de una pelicula luego de ser evaluada. 
  data Film = Film { film_id            :: Int,
                     imdb_code          :: String,
                     title              :: String,
                     year               :: Int,
                     rating             :: Float,
                     runtime            :: Int,
                     genres             :: [String],
                     synopsis           :: String,
                     language           :: String,
                     background_image   :: String,
                     cover_image        :: String,
                     torrents           :: [Torrent]
                   } deriving (Show, Eq, Ord)

  -- Representacion de un archivo torrent luego de que la película correspondiente sea evaluada.
  data Torrent = Torrent { hash         :: String,
                           url          :: String,
                           quality      :: String,
                           seeds        :: Int,
                           peers        :: Int,
                           size         :: String
                         } deriving (Show, Eq, Ord)
