#pylint: disable=invalid-name, missing-function-docstring, line-too-long, logging-fstring-interpolation, missing-class-docstring, missing-module-docstring, wildcard-import, unused-wildcard-import
# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import math
from dataclasses import dataclass
from typing import Tuple, Optional, Dict, List
from .utils import *

@dataclass(init=False)
class TFService:
    input_sip: str
    output_sip: str
    uuid: str
    capacity: int

    def __init__(self, uuid, input_sip, output_sip, capacity):
        self.uuid = uuid
        self.input_sip = input_sip
        self.output_sip = output_sip
        # Capacity must be in multiples of 25 gigabits
        if 0 == capacity:
            self.capacity = 0
        else:
            self.capacity = math.ceil(capacity/25) * 25

    def __str__(self):
        return f"({self.uuid}, {self.input_sip}, {self.output_sip}, {self.capacity})"

    def name(self) -> str:
        return f"TF:{self.uuid}"

    def input_mod_aid_vlan(self) -> Tuple[str, str, Optional[str]]:
        return ifname_to_module_aid_vlan(self.input_sip)

    def output_mod_aid_vlan(self) -> Tuple[str, str, Optional[str]]:
        return ifname_to_module_aid_vlan(self.output_sip)

    # Return endpoints in a form suitable for selectors in various
    # JSON constructs used by the CM API
    def get_endpoint_selectors(self) -> List[Dict]:
        return [make_selector(*self.input_mod_aid_vlan()), make_selector(*self.output_mod_aid_vlan())]

    #  -> List[Tuple(str, str)]
    def get_endpoints_mod_aid(self):
        m1, a1, _ = self.input_mod_aid_vlan()
        m2, a2, _ = self.output_mod_aid_vlan()

        return [(m1, a1), (m2, a2)]

    #  -> List[Tuple(str, str)]
    def get_endpoints_mod_aid_vlan(self):
        m1, a1, v1 = self.input_mod_aid_vlan()
        m2, a2, v2 = self.output_mod_aid_vlan()

        return [(m1, a1, v1), (m2, a2, v2)]
