@startuml "Sequence Diagram"

actor "Usuário"               as USER
boundary "Suggestions"        as SUGGESTIONS
boundary "SearchResults"      as SEARCH_RESULTS
boundary "CourseConcurrency"  as COURSE_CONCURRENCY

USER -> SUGGESTIONS : 1. Acessa a tela de sugestões na Tab "Já sei o que quero"
SUGGESTIONS -> SUGGESTIONS : 1.1. Obtém as informações de Campus, cursos e professores salvas em cache : useCampusData()
SUGGESTIONS -->> SUGGESTIONS : Carrega todas as informações do Campus contendo os Cursos : Optional<CampusWithCourseResponse>[]
SUGGESTIONS -->> USER : A tela é modificada para o usuário pesquisar cursos
USER -> SUGGESTIONS : 2. Informa margem de notas de corte : setNoteRange()
USER -> SUGGESTIONS : 3. Informa o campus preferencial : setCampusSelected()
USER -> SUGGESTIONS : 4. Informa o curso preferencial : setCourseSelected()
USER -> SUGGESTIONS : 5. Clica no botão "Pesquisar" : onSearchClick()
SUGGESTIONS -> SUGGESTIONS : 5.1. Filtra os cursos pelo Campus preferencial escolhido pelo usuário : filter()
SUGGESTIONS -->> SUGGESTIONS : Retorna os cursos com o filtro aplicado : CampusCourse[]
SUGGESTIONS -> SUGGESTIONS : 5.2. Filtra os cursos pelo Curso preferencial escolhido pelo usuário : filter()
SUGGESTIONS -->> SUGGESTIONS : Retorna os cursos com o filtro aplicado : CampusCourse[]
SUGGESTIONS -> SUGGESTIONS : 5.3. Filtra os cursos pelo limite de notas definido pelo usuário no MultiSlider : filter()
SUGGESTIONS -->> SUGGESTIONS : Retorna os cursos com o filtro aplicado : CampusCourse[]
SUGGESTIONS -> SUGGESTIONS : 5.4. Navega para a tela de resultados de pesquisas de cursos : navigate()
SUGGESTIONS ->> SEARCH_RESULTS : 5.4.1. Tela é carregada de forma assíncrona : componentDidMount()
SEARCH_RESULTS -> SEARCH_RESULTS : 5.4.1.1. Obtém a referência da rota atual para ler os parâmetros : useRoute()
SEARCH_RESULTS -->> SEARCH_RESULTS : Retorna a rota atual : RouteProp<RoutesParamList, SEARCH_RESULTS>
SEARCH_RESULTS -> SEARCH_RESULTS : 5.4.1.2. Obtém a referência de navegação para navegar a outras telas : useNavigation()
SEARCH_RESULTS -->> SEARCH_RESULTS : Retorna o objeto de navegação : CourseNavigationProp
SEARCH_RESULTS -> SEARCH_RESULTS : 5.4.1.3. Carrega as cores do tema sendo utilizado atualmente : useTheme()
SEARCH_RESULTS -->> SEARCH_RESULTS : Retorna o tema usado atualmente e seu respectivo Setter : [ThemeValue, (v: ThemeValue) => void]
SEARCH_RESULTS -> SEARCH_RESULTS : 5.4.1.4. Registra um evento que dispara sempre que a tela é acessada : useEnterScreen()
note right
  Este evento é responsável por 
  alterar o State da lista de 
  cursos a serem renderizadas 
  (com base nos resultados 
  encontrados).
end note
SEARCH_RESULTS -> SEARCH_RESULTS : 5.4.1.5. Percorre e exibe todos os cursos recebidos como parâmetros no useRoute : map()
SEARCH_RESULTS -->> SEARCH_RESULTS : Retorna os botões de cursos a serem renderizados : JSX.Element[]
USER -> SEARCH_RESULTS : 6. Clica em um dos cursos exibidos na tela : onCourseClick()
SEARCH_RESULTS -> SEARCH_RESULTS : 6.1. Navega para a tela de informações de concorrência do curso : navigate()
SEARCH_RESULTS ->> COURSE_CONCURRENCY : 6.1.1. Tela é carregada de forma assíncrona : componentDidMount()
COURSE_CONCURRENCY -> COURSE_CONCURRENCY : 6.1.1.1. Obtém a referência da rota atual para ler os parâmetros : useRoute()
COURSE_CONCURRENCY -> COURSE_CONCURRENCY : 6.1.1.2. Define as notas do curso na modalidade SSA : setSsaGrade()
COURSE_CONCURRENCY -> COURSE_CONCURRENCY : 6.1.1.3. Define as notas do curso na modalidade SISU : setSisuGrade()
note right
  Nesse momento a página/tela é 
  completamente renderizada e 
  todos os elementos gráficos 
  estão disponíveis.
end note

@enduml
