from ipaddress import ip_network

from ..schema import schema
from .base import OpenWrtConverter


class Rules(OpenWrtConverter):
    netjson_key = 'ip_rules'
    intermediate_key = 'network'
    _uci_types = ['rule', 'rule6']
    _schema = schema['properties']['ip_rules']['items']

    def to_intermediate_loop(self, block, result, index=None):
        rule = self.__intermediate_rule(block, index)
        result.setdefault('network', [])
        result['network'].append(rule)
        return result

    def __intermediate_rule(self, rule, index):
        src_net = None
        dest_net = None
        family = 4
        if 'src' in rule:
            src_net = ip_network(rule['src'])
        if 'dest' in rule:
            dest_net = ip_network(rule['dest'])
        if dest_net or src_net:
            family = dest_net.version if dest_net else src_net.version
        rule.update(
            {
                '.type': 'rule{0}'.format(family).replace('4', ''),
                '.name': rule.pop('name', None) or self.__get_auto_name(index),
            }
        )
        return self.sorted_dict(rule)

    def __get_auto_name(self, i):
        return 'rule{0}'.format(i)

    def to_netjson_loop(self, block, result, index):
        rule = self.__netjson_rule(block, index)
        result.setdefault('ip_rules', [])
        result['ip_rules'].append(rule)
        return result

    def __netjson_rule(self, rule, i):
        _name = rule.pop('.name')
        if _name != self.__get_auto_name(i):
            rule['name'] = _name
        del rule['.type']
        return self.type_cast(rule)