@startuml
skinparam monochrome true
skinparam packageStyle rectangle
skinparam shadowing false

autonumber
title Sequence Diagram Full - US20: As a client, I want to read the response for the appointment request, to accept or reject it.

'hide footbox
actor "Client" as Client
participant ":ListBookingRequestsPendingUI" as UI
participant ":ListBookingRequestsPendingController" as CTRL
participant "visitRepository\n:VisitRepository" as VisitRepository
participant "visit\n:Visit" as Visit
participant "client\n:Client" as client
participant "visitState\n:VisitState" as VisitState
participant "visitJustification\n:VisitJustification" as VisitJustification
participant "listOfPendingVisit\n:List<Visit>" as listOfVisit
participant ":Repositories" as RepositorySingleton
participant "repositories\n:Repositories" as PLAT
participant ":ApplicationSession" as _APP
participant "appSession\n:ApplicationSession" as APP
participant "currentSession\n:UserSession" as SESSAO
participant "Interface:\n ExternalEmailModule" as IM
participant "externalMailModule:\n:ExternalEmailModule" as EM


activate Client
       ' - ** - '

         Client -> UI : Asks for all my appointment/visits response
        activate UI

            create CTRL
                    UI -> CTRL** : create

                UI -> CTRL :  getAllVisitRequest()

                        activate CTRL

                         note right
                               Get all the visits appointment
                         end note

                   CTRL -> RepositorySingleton : getInstance()
                                activate RepositorySingleton


                                    RepositorySingleton --> CTRL: repositories
                                deactivate RepositorySingleton

                                CTRL -> PLAT : getVisitRepository()
                                activate PLAT

                                    PLAT -> CTRL : VisitRepository
                                deactivate PLAT


                                  CTRL -> CTRL : getUserFromSession()

                                     note top
                                       Get current user email
                                     end note

                                                CTRL -> _APP: getInstance()
                                                activate _APP
                                                    _APP -> CTRL: appSession
                                                deactivate _APP

                                                CTRL -> APP: getCurrentSession()
                                                activate APP

                                                    APP --> CTRL: currentSession
                                                deactivate APP

                                                CTRL -> SESSAO: email = getUserEmail()
                                                activate SESSAO


                                                deactivate SESSAO



                    CTRL -> VisitRepository : listOfPendingVisits = getVisitRequestByClientEmailAndStatus(email, answered)

                                                 note top
                                                        Get current user email and VisitStatus answered
                                                 end note

                                  activate VisitRepository

                                 VisitRepository --> listOfVisit** : Create()




                    loop [for each visit]
                        VisitRepository -> Visit : getVisitRequestByClientEmailAndStatus(email,answered)
                                      activate Visit

                              Visit -> client   : hasClientEmail = hasClientEmail(email)
                                activate client
                             deactivate client

                                        Visit --> VisitRepository : True/false


                                        Visit -> VisitState   : hasVisitSateAnswered = hasVisitSateAnswered()
                                        activate VisitState
                                        deactivate VisitState

                                          Visit --> VisitRepository : True/false
                                            deactivate Visit

                                       alt if both true
                                       VisitRepository -> listOfVisit : addVisitToListOfPendingVisits(visit)
                                       activate listOfVisit
                                       deactivate listOfVisit
                                       end


                    end



                    deactivate VisitRepository


         CTRL --> UI : Show List of visits Pending Confirmation
         deactivate CTRL

        UI --> Client : Show List of visits Pending Confirmation
       deactivate UI

       Client -> UI : select one visit to confirm or decline
       activate UI


       UI -> CTRL : getVisitFromListOfPendingVisits(visitName)


       activate CTRL

       CTRL -> listOfVisit : visit = getVisitFromListOfPendingVisits(visitName)
       activate  listOfVisit
       deactivate listOfVisit


      CTRL -> IM : sendAcknowledgmentEmail(visit)
      deactivate CTRL

      activate IM



       IM -> EM:  sendAcknowledgmentEmail(visit)
          note top
                         visit object has Agent and Property for AC2 and AC3
                         end note


        activate EM
        deactivate IM
        deactivate EM


       UI -> Client : ask to confirm or deny
          deactivate UI

       opt confirm


       Client -> UI : Confirm
       activate UI


        UI -> CTRL : sendConfirmEmail()
        activate CTRL

                       CTRL -> Visit : setVisitStateConfirmed()
                       activate Visit


                      Visit -> VisitState : setVisitStateConfirmed()
                      activate VisitState
                      deactivate Visit
                      deactivate VisitState

                      CTRL -> IM : sendAcceptEmail(visit)
                        activate IM


                        IM -> EM: sendAcceptmail( visit)
                         activate EM
                  note top
                  visit object has Agent and Property for AC2 and AC3
                  end note

                EM --> IM : confirm Message sent

                deactivate EM

                IM --> CTRL : confirm Message sent
                 deactivate IM
                 CTRL --> UI  : confirm Message sent
                deactivate CTRL







       UI --> Client : Show success of confirm visit appointment
       deactivate UI


       else decline

       Client -> UI : decline
       activate UI

       UI -> Client : Asks for justification
       deactivate UI

       Client -> UI : types justification


        activate UI
        UI -> CTRL : sendDeclineEmail(justification)

        activate CTRL

                                CTRL -> Visit : setVisitStateDenied()
                               activate Visit


                              Visit -> VisitState : setVisitStateDenied()
                              activate VisitState
                              deactivate Visit
                              deactivate VisitState


        CTRL -> Visit : setJustification(justification)
        activate Visit
        Visit -> VisitJustification :setJustification(justification)
        activate VisitJustification
        deactivate VisitJustification

        deactivate Visit

        CTRL -> IM : sendDeclineEmail(visit)


        activate IM


        IM -> EM: sendDeclineEmail(visit)
         activate EM

        EM --> IM : decline Message sent

            note top
               visit object has Agent and Property for AC2 and AC3
            end note
        deactivate EM

        IM --> CTRL : decline Message sent
         deactivate IM
         CTRL --> UI  : decline Message sent
        deactivate CTRL



       UI --> Client : Show success of decline message sent
       deactivate UI

       end

deactivate Client

@enduml