/*
 * Copyright (c) 1997-1999 Departamento de Informática - UFPE
 */

/**
 * Esta classe simula uma outra sessão num ambiente unix.
 *
 * Esta nova sessao tambem aceita os seguintes comandos:
 *
 *	su (muda de usuario)
 *	passwd (muda a senha)
 *	sair (finaliza o processo)
 *
 * Autor: Sergio Castelo Branco Soares
 *        http://www.di.ufpe.br/~scbs  
 *
 * Obs: A documentacao para os metodos ainda nao vistos em sala
 *      pode ser encontrada em: 
 *      http://www.javasoft.com/products/jdk/1.2/docs/api/index.html
 */
public class NSessao
{

//Variaveis estaticas podem ser acessadas sem instanciacao da classe.
 static Usuario user1;
 static Usuario user2;
 static Usuario user3;
 static Usuario user;
 static Usuario oldUser;
 static Arquivo arq1;
 static Arquivo arq2;
 static Diretorio corrente;
 static Diretorio subdir;
 static byte[] bytes = new byte[30];
 static String entrada;
 static String entrada2;
 static String entrada3;
 static String entrada4;
 static int sair = 1;
 static int saida = 1;


/**
 * Realiza o login de um usuario.
 */
public static void logar(){

   saida = 1;
   oldUser = user;
   System.out.print("login: ");
   System.out.flush();                  //Semelhante a C, limpa o stream out.

   //Clausula para tratamento de uma possivel excecao
   //levantada pelo metodo read
   try{                                 
         System.in.read(bytes);         //Metodo que le o conteudo do stream in e
                                        //atribui o valor lido a variavel bytes.
   } catch(Exception e){                //Tratamento da excecao.
         System.out.println("Erro na entrada.");
   }

   entrada = new String(bytes);         //Instanciacao de uma nova string a partir
                                        //do valor lido do stream in.
   entrada2 = entrada.trim();           //trim() retira espacos em branco no 
                                        //comeco e fim da string.

   if(entrada2.equals(user1.getLogin())) {  //Equals é utilizado para comparacao
         user = user1;                      //de objetos, no caso, String.
   }      
   else {
       if (entrada2.equals(user2.getLogin())) {
             user=user2;
       }      
       else {
           if (entrada2.equals(user3.getLogin())) {
               user=user3;
           }       
           else{
               System.out.println("\nVoce^ nao e' um usuario autorizado.\n Adeus.");
               saida = 0;
           }
       }  
   }
   if (saida == 1) {
       System.out.print("senha: ");
       System.out.flush();

       try{                                                              
           System.in.read(bytes);
       } catch(Exception e) {
           System.out.println("Erro na entrada de dados.");
       }
    
       entrada = new String(bytes);
                                           
       if (!user.verificarSenha(entrada.trim())){
           System.out.println("\nSenha invalida.\nAcesso negado");
           if (oldUser.getNome().equals("ninguem")){
               return;
           }
           else {
               saida = 0;
           }
       }
       else {
           System.out.println("\nBem-vindo, "+user.getNome());
       }
   }          
   else {
       System.out.println("\nTente novamente");
   }
}    

public static void main(String argv[]){

   user1 = new Usuario("dcsa","Debora Aranha",0);
   user2 = new Usuario("vd","Vodu",0);
   user3 = new Usuario("jn","Joao Ninguem",0);
   oldUser = new Usuario("ninguem","a",0);

   logar();
   corrente = user.getHome();
   System.out.println("Diretorio corrente: "+corrente.getNome());

   arq1 = new Arquivo("Vodu1",user);
   arq2 = new Arquivo("Vodu2",user);

   System.out.println("\ncriando arquivos Vodu1 e Vodu2");
   corrente.inserirArquivo(arq1);
   corrente.inserirArquivo(arq2);

   System.out.println("\n"+corrente.getNome()+">ls");
   corrente.ls();

   System.out.println("\n"+corrente.getNome()+">rm arq1");
   corrente.removerArquivo(arq1);
   System.out.println("\n"+corrente.getNome()+">ls");
   corrente.ls();

   System.out.println("\n"+corrente.getNome()+">mkdir sub1");
   subdir = new Diretorio("sub1");
   corrente.mkdir(subdir);           
   System.out.println("\n"+corrente.getNome()+">ls");
   corrente.ls();

//Modificacoes

   while(sair==1) {
      bytes = new byte[30];
      entrada =  new String(bytes);
      System.out.print("\njavateste{"+user.getLogin()+"} % ");
      System.out.flush();
     
      try{
          System.in.read(bytes);
      } catch(Exception e) {
          System.out.println("Erro na entrada de dados.");
      }
      
      entrada = new String(bytes);
      
      if (entrada.trim().equals("passwd")){
          System.out.print("Entre com a senha velha: ");
          bytes = new byte[30];
          System.out.flush();
          
          try{
              System.in.read(bytes);
          } catch(Exception e) {
              System.out.println("Erro na entrada de dados.");
          }
   
          entrada3 = new String(bytes);
   
          if (user.verificarSenha(entrada3.trim())){
              System.out.print("Entre com a senha nova: ");
              bytes = new byte[30];
              System.out.flush();
            
              try{
                  System.in.read(bytes);
              } catch(Exception e) {
                  System.out.println("Erro na entrada de dados.");
              }
            
              entrada4 = new String(bytes);
              user.mudarSenha(entrada3.trim(), entrada4.trim());
              System.out.println("\n\nSenha modificada com sucesso");
          }
          else {
              System.out.println("\nSenha incorreta\nSorry");
          }
      }
      if (entrada.trim().equals("su")){
          logar();
      }                                    
      
      if (entrada.trim().equals("sair")){
          System.out.println("\nAdeus "+user.getNome()+"\n");
          sair=0;
      }
   }
}
}
