<?php

function GetMarkByComment($Comment)
{
  global $Database;

  $DbResult = $Database->query('SELECT `Id` FROM `NetworkMark` WHERE `Comment`="'.$Comment.'"');
  if($DbResult->num_rows > 0)
  {
    $DbRow = $DbResult->fetch_assoc();
    return($DbRow['Id']);
  } else
  {
    $DbResult = $Database->query('INSERT INTO `NetworkMark` (`Comment`) VALUES ("'.$Comment.'")');
    return($Database->insert_id);
  }
}

function GetSubgroupByRange($AddressRange)
{
  global $Database;

  $DbResult = $Database->query('SELECT `Id` FROM `NetworkMangleSubgroup` WHERE `AddressRange`="'.$AddressRange.'"');
  if($DbResult->num_rows > 0)
  {
    $DbRow = $DbResult->fetch_assoc();
    return($DbRow['Id']);
  } else
  {
    $DbResult = $Database->query('INSERT INTO `NetworkMangleSubgroup` (`AddressRange`) VALUES ("'.$AddressRange.'")');
    return($Database->insert_id);
  }
}

function InsertToAddressTree(&$Tree, $Address, $Name, $InterSubnets = false, $ForceMark = false)
{
  global $Config;

  $Found = false;
  foreach($Tree['Items'] as $Index => $Node)
  {
    if($Node['Address']->Contain($Address))
    {
      InsertToAddressTree($Tree['Items'][$Index], $Address, $Name, true);
      $Found = true;
    }
  }
  if($Found == false)
  {
    if($InterSubnets and ($Tree['Address']->Prefix < $Config['MainRouter']['MangleRuleSubgroupMinPrefix']) and
    ($Address->Prefix > ($Tree['Address']->Prefix + 1)))
    {
      $NewAddress = new NetworkAddressIPv4();
      $NewAddress->Address = $Address->Address;
      $NewAddress->ChangePrefix($Tree['Address']->Prefix + 1);
      //echo('InsertToTree('.$NewAddress->AddressToString().'/'.$NewAddress->Prefix.')'."\n");
      $Tree['Items'][] = array('Address' => $NewAddress, 'Name' => $Name, 'Items' => array(), 'ForceMark' => false);
      InsertToAddressTree($Tree['Items'][count($Tree['Items']) - 1], $Address, $Name, true);
    } else
    {

      $NewNode = array('Address' => $Address, 'Name' => $Name, 'Items' => array(), 'ForceMark' => $ForceMark);

      // Should be existed items placed under new node?
      $Found = false;
      foreach($Tree['Items'] as $Index => $Node)
      {
        if(($Node['Address']->Address == $NewNode['Address']->Address) and
        ($Node['Address']->Prefix == $NewNode['Address']->Prefix)) $Found = true;

        //echo($Index.',');
        if($Address->Contain($Node['Address']))
        {
          $NewNode['Items'][] = $Node;
          unset($Tree['Items'][$Index]);
        }
      }
      if($Found == false) $Tree['Items'][] = $NewNode;
    }
  }
}

function ShowSubnetNode($Node, $Indent = 0)
{
  echo(str_repeat('  ', $Indent).$Node['Address']->AddressToString().'/'.$Node['Address']->Prefix.' '.$Node['Name']."\n");
  foreach($Node['Items'] as $Index => $Item)
  {
    ShowSubnetNode($Item, $Indent + 1);
  }
}

/*
function Test()
{
  $SubnetTree = array('Address' => new NetworkAddressIPv4(), 'Items' => array());

  $NewAddress = new NetworkAddressIPv4();
  $NewAddress->AddressFromString('10.145.64.0');
  $NewAddress->Prefix = 24;
  InsertToAddressTree($SubnetTree, $NewAddress);
  $NewAddress = new NetworkAddressIPv4();
  $NewAddress->AddressFromString('10.145.64.0');
  $NewAddress->Prefix = 29;
  InsertToAddressTree($SubnetTree, $NewAddress);
  $NewAddress = new NetworkAddressIPv4();
  $NewAddress->AddressFromString('10.145.65.0');
  $NewAddress->Prefix = 24;
  InsertToAddressTree($SubnetTree, $NewAddress);
  $NewAddress = new NetworkAddressIPv4();
  $NewAddress->AddressFromString('10.145.65.156');
  $NewAddress->Prefix = 32;
  InsertToAddressTree($SubnetTree, $NewAddress);
  $NewAddress = new NetworkAddressIPv4();
  $NewAddress->AddressFromString('10.145.64.0');
  $NewAddress->Prefix = 20;
  InsertToAddressTree($SubnetTree, $NewAddress);


  ShowSubnetNode($SubnetTree);
  die();
}
*/
