@startuml services_class_diagram

package firebase {
    package service as firebase.service {
        interface FirebaseService {
            + login(): Future<void>
            + createWebApp(String projectId): Future<void>
            + deployHosting(String projectId, String target, String appPath): Future<void>
            + deployFirebase(String projectId, String firebasePath): Future<void>
            + configureAuthProviders(String projectId) : String
            + enableAnalytics(String projectId) : void
            + initializeFirestoreData(String projectId) : void
            + upgradeBillingPlan(String projectId) : void
            + acceptTerms() : void
        }
    }

    package adapter as firebase.adapter {
        class FirebaseCliServiceAdapter {
            - _firebaseCli: FirebaseCli
            - _prompter : Prompter
        }
    }

    package cli as firebase.cli {
        class FirebaseCli {
            + login(): Future<void>
            + addFirebase(String projectId): Future<void>
            + createWebApp(String projectId, String appName): Future<void>
            + setFirebaseProject(String projectId, String workingDirectory): Future<void>
            + clearTarget(String target, String workingDirectory): Future<void>
            + applyTarget(String hostingName, String target, String workingDirectory): Future<void>
            + deployHosting(String target, String workingDirectory): Future<void>
            + deployFirestore(String workingDirectory): Future<void>
            + deployFunctions(String workingDirectory): Future<void>
            + version(): Future<void>
        }
    }
}

package gcloud {
    package service as gcloud.service {
        interface GCloudService {
            + login() : Future<void>
            + createProject() : Future<String>
        }
    }

    package adapter as gcloud.adapter {
        class GCloudCliServiceAdapter {
            - _gcloudCli : GCloudCli
            - _prompter : Prompter
        }
    }

    package cli as gcloud.cli {
        class GCloudCli {
            + login(): Future<void>
            + createProject(String projectId): Future<void>
            + listRegions(): Future<void>
            + createProjectApp(String region, String projectId): Future<void>
            + enableFirestoreApi() : Future<void>
            + createDatabase(String region, String projectId): Future<void>
            + version() : Future<void>
        }
    }
}

package flutter {
    package service as flutter.service {
        interface FlutterService  {
            + build(String appPath) : Future<void>
        }

    }

    package adapter as flutter.adapter {
        class FlutterCliServiceAdapter  {
            - _flutterCli : FlutterCli
        }
    }

    package cli as flutter.cli {
        class FlutterCli {
            + version(): Future<void>
            + enableWeb(): Future<void>
            + buildWeb(String workingDirectory): Future<void>
        }
    }
}

package git {
    package service as git.service {
        interface GitService  {
            + checkout(String repoUrl, String targetDirectory) : Future<void>
        }
    }

    package adapter as git.adapter {
        class GitCliServiceAdapter {
            - _gitCli : GitCli
        }
    }

    package cli as git.cli {
        class GitCli {
            + clone(String repoUrl, String directory): Future<void>
            + version(): Future<void>
        }
    }
}

package npm {
    package service as npm.service {
        interface NpmService  {
            + installDependencies(String path) : Future<void>
        }
    }

    package adapter as npm.adapter {
        class NpmCliServiceAdapter {
            - _npmCli : NpmCli
        }
    }

    package cli as npm.cli {
        class NpmCli {
            + install(String workingDirectory): Future<void>
            + version(): Future<void>
        }
    }
}

package sentry {
    package service as sentry.service {
        interface SentryService {
            + login() : Future<void>
            + createRelease(String appPath) : Future<void>
        }
    }

    package adapter as sentry.adapter {
        class SentryCliServiceAdapter {
            - _sentryCli : SentryCli
            - _fileHelper : FileHelper
        }
    }

    package cli as sentry.cli {
        class SentryCli {
            + login(): Future<void>
            + createRelease(String releaseName, SentryProject project): Future<void>
            + uploadSourceMaps(String sourcePath, List<String> extensions, SentryProject project): Future<void>
            + finalizeRelease(String releaseName, SentryProject project): Future<void>
            + version(): Future<void>
        }
    }
    package model as sentry.model{
        class SentryProject {
            + organizationSlug : String
            + projectSlug : String
        }
    }
}

package interfaces {
    package service {
        interface InfoService {
            + version() : Future<void>
        }
    }

    package cli {
        interface Cli {
            + version() : Future<void>
        }
    }
}

package helper {
    class FileHelper {
        + getFile(String path) : File
        + getDirectory(String path) : Directory
        + replaceEnvironmentVariables(File file, Map<String, dynamic> environment) : void
    }
}

FirebaseCliServiceAdapter .right.|> FirebaseService
GCloudCliServiceAdapter .right.|> GCloudService
FlutterCliServiceAdapter .right.|> FlutterService
GitCliServiceAdapter .right.|> GitService
NpmCliServiceAdapter .right.|> NpmService
SentryCliServiceAdapter .right.|> SentryService

FirebaseCliServiceAdapter -right-> FirebaseCli : uses
GCloudCliServiceAdapter -right-> GCloudCli : uses
FlutterCliServiceAdapter -left-> FlutterCli : uses
GitCliServiceAdapter -left-> GitCli : uses
NpmCliServiceAdapter -left-> NpmCli : uses
SentryCliServiceAdapter -left-> SentryCli : uses
SentryCliServiceAdapter --> FileHelper : uses
SentryCliServiceAdapter --> SentryProject : uses

FirebaseCli .up.|> Cli
GCloudCli .up.|> Cli
SentryCli .up.|> Cli
FlutterCli .down.|> Cli
GitCli .down.|> Cli
NpmCli .down.|> Cli

SentryCli --> SentryProject : uses

firebase --[hidden]right--> gcloud
InfoService --[hidden]right--> Cli

FirebaseService -up-|> InfoService
GCloudService -up-|> InfoService
SentryService -up-|> InfoService
GitService -down-|> InfoService
FlutterService -down-|> InfoService
NpmService -down-|> InfoService

@enduml
