<?php

namespace App\Modules\Network\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Log;

use App\Modules\Network\Models\PrefixSubtenants;
use App\Modules\Network\Models\Supernets;

class Prefixes extends Model
{
    use SoftDeletes;

    protected $fillable = [
        'name',
        'address',
        'mask',
        'seen_at',
        'still_announced',
        'created_source',
        'organisation_id',
        'asn_id',
    ];

    protected $dates = [
        'created_at',
        'seen_at',
        'updated_at',
    ];

    public static function validOwner($_x, $_organisation_id) {
        $x = Prefixes::where([['organisation_id', '=', $_organisation_id],['id', '=', $_x]])->first();
        
        return $x ? $x : false;
    }

    public function getCidr() {
        return $this->address . '/' . $this->mask; 
    }

    public static function isTrueSubnet($_prefix_id) {
        return Supernets::where('supernet_id', '=', $_prefix_id)->get()->count() ? false : true;
    }

    public static function getOrganisationPrefixes($_subtenant_id) {
        // Supernet related prefixes
        $owned_prefixes = Prefixes::where('organisation_id', '=', $_subtenant_id)->get();

        // Subtenanting related prefixes
        $prefix_subtenants = PrefixSubtenants::where([['subtenant_id', '=', $_subtenant_id]])->get();

        $indirect_sub_prefixes = Prefixes::select('prefixes.id', 'address', 'mask', 'still_announced')->leftJoin('supernets', 'supernet_id', '=', 'prefixes.id')->whereIn('supernet_id', $prefix_subtenants->where('also_subnets', '=', 1)->pluck('prefix_id'))->get();
        $direct_sub_prefixes = Prefixes::whereIn('id', $prefix_subtenants->where('also_subnets', '=', 0)->pluck('prefix_id'))->get();

        return $direct_sub_prefixes->merge($indirect_sub_prefixes)->merge($owned_prefixes)->unique();
    }

    public static function getOrganisationHasPrefix($_subtenant_id, $_prefix_id) {
        // Supernet related prefixes
        $owned_prefixes = Prefixes::where('organisation_id', '=', $_subtenant_id)->where('id', '=', $_prefix_id)->get();
        if($owned_prefixes->count() != 0) {
            return $owned_prefixes->first();
        }

        // Subtenanting related prefixes
        $prefix_subtenants = PrefixSubtenants::where([['subtenant_id', '=', $_subtenant_id]])->get();

        $indirect_prefixes = Prefixes::select('prefixes.id', 'address', 'mask', 'still_announced')->leftJoin('supernets', 'supernet_id', '=', 'prefixes.id')->whereIn('supernet_id', $prefix_subtenants->where('also_subnets', '=', 1)->pluck('prefix_id'))->where('prefixes.id', '=', $_prefix_id)->get();

        if($indirect_prefixes->where('id', '=', $_prefix_id)->count() != 0) {
            Log::debug($indirect_prefixes);
            return $indirect_prefixes->where('id', '=', $_prefix_id)->first();
        }
        
        $direct_prefixes = Prefixes::whereIn('id', $prefix_subtenants->where('also_subnets', '=', 0)->pluck('prefix_id'))->get();

        if($direct_prefixes->where('id', '=', $_prefix_id)->count() != 0) {
            return $direct_prefixes->where('id', '=', $_prefix_id)->first();
        }

        return false;
    }

    public static function getIsInAnnouncedSupernet($_subnet_id) {
        return Prefixes::leftJoin('supernets', 'supernet_id', '=', 'prefixes.id')->where('subnet_id', '=', $_subnet_id)->where('still_announced', '=', '1')->count() ? true : (Prefixes::find($_subnet_id)->still_announced ? true : false); 
    }

}
