# Implementação do módulo {comando_fazer_login}.

# Interfaces do projeto usadas por esta implementação:
import usuario
import sessao
import compra
import gera_html_pag

# Outros módulos usados por esta implementação:
import secrets

def processa(ses, dados):
  ses_nova = ses # Caso o login falhe.

  if ses != None:
    # Não deveria acontecer, mas por via das dúvidas:
    pag = gera_html_pag.mensagem_de_erro(ses, "Favor sair da sessão corrente primeiro")
  else:
    erros = [].copy()
    if not 'email' in dados:
      erros.append("Campo 'email' é obrigatório")
    if not 'senha' in dados:
      erros.append("Campo 'senha' é obrigatório")

    if len(erros) == 0:
      email = dados['email']
      senha = dados['senha'] 
      id_usuario = usuario.busca_por_email(email)
      if id_usuario == None:
        erros.append("Usuário " + email + " não está cadastrado")
      else:
        usr = usuario.busca_por_identificador(id_usuario)
        atrs_usr = usuario.obtem_atributos(usr)
        if atrs_usr["senha"] == senha:
          cookie = secrets.token_urlsafe(32)
          carrinho = define_carrinho(usr, id_usuario)
          ses_nova = sessao.cria(usr, cookie, carrinho)
        else:
          erros.append("Senha incorreta")
    if len(erros) == 0:
      pag = gera_html_pag.principal(ses_nova, None)
    else:
      pag = gera_html_pag.entrar(ses, erros)
  return pag, ses_nova

def define_carrinho(usr, id_usuario):
  """Esta funcao busca por compras em aberto do usuário {usr}. Se houver alguma nessa 
  condicao, entao uma delas sera usada como carrinho, caso contrario, será criado
  um novo carrinho vazio."""
  # !!! Deveria retornar a lista de todas as compras em aberto, não apenas a primeira encontrada. !!!
  lista_id_compras = compra.busca_por_usuario(id_usuario)
  if not lista_id_compras:
    return compra.cria(usr)
  else:
    for id_compra in lista_id_compras:
      obj_compra = compra.busca_por_identificador(id_compra)
      if compra.obtem_status(obj_compra) == 'aberto':
        return obj_compra
  return compra.cria(usr)
