@startuml
struct CiscoCreateData {
    + ip: str
    + login: str
    + password: str
    + port: str = DEFAULT_SSH_PORT
    + device_name: str
    + device_protocol: str
    + manufacturer: str = CISCO_ASA_MANUFACTURER
}

struct CiscoAuthenticationCheckDataPyModel {
    + ip: str
    + manufacturer: NOT NEEDED - SET CISCO
    + login: str
    + password: str
    + port: int
    + device_name: str
}


package CiscoApp {
    class AsaBackendService {
        + {static} create_cisco_asa_insatnce(\n	name: str,\n	ip: str,\n	user: str,\n	password: str,\n	enable_password: str,\n	connection_type: Optional[str] = CONNECTION_CLI_TYPE,\n	protocol: Optional[str] = CONNECTION_SSH_PROTOCOL,\n	rsa_limit: Optional[int] = 0,\n	port: Optional[str] = DEFAULT_ASA_PORT,\n	description: Optional[str] = "",\n	administrators: Optional[list] = None\n)
    }
    AsaBackendService --> CiscoASAUnifiedStrategy : "Использование статического\nметода create_cisco_asa_instance"

    class CiscoFTDRepository {
        + {static} create_instance(create_data: Dict)
    }
    CiscoFTDRepository --> CiscoFTDUnifiedStrategy : "Использование статического\nметода create_instance"

    class CiscoFTDCreateDataModel {
        name: str
        ip: str
        username: str
        password: str
        connection_type: str = CONNECTION_CLI_TYPE
        port: int = DEFAULT_FTD_PORT
        description: str = ""
        administrators: List[int] = []
    }
    CiscoFTDCreateDataModel --> CiscoFTDRepository : "Pydantic model\nдля валидации create_data"

    abstract CiscoUnifiedStrategyABC{
        + create_instance(cisco_create_data: Dict)
        + check_authentication_status(cisco_connect_data: Dict)
    }


    class CiscoFTDUnifiedStrategy {
        + create_instance(cisco_create_data: Dict)
        + check_authentication_status(cisco_connect_data: Dict)
    }
    CiscoFTDUnifiedStrategy ..|> CiscoUnifiedStrategyABC

    class CiscoASAUnifiedStrategy {
        + create_instance(cisco_create_data: Dict)
        + check_authentication_status(cisco_connect_data: Dict)
    }
    CiscoASAUnifiedStrategy ..|> CiscoUnifiedStrategyABC

    class CiscoUnifiedManager {
        + cisco_create_strategy: CiscoCreateStrategyABC
        + create_cisco_instance(cisco_create_data: Dict)
        + check_authentication(cisco_connect_data: Dict)
    }
    CiscoUnifiedStrategyABC --* CiscoUnifiedManager
    CiscoUnifiedManager --* .PingServices.FirewallAuthStatusService
}

package PingServices {
    class FirewallAuthStatusService {
        + manufacturer: str
        + ip: str
        + login: str
        + password: str
        + port: str
        + device_name: Optional[str]
        + device_protocol: Optional[str]
    }
}

@enduml