# -*- coding: utf-8 -*-
#
# connectivity_landscape.py
#
# Copyright 2017 Sebastian Spreizer
# The MIT License

import numpy as np
import noise

__all__ = [
    'symmetric',
    'homogeneous',
    'random',
    'tiled',
    'Perlin',
    'Perlin_uniform',
    'move'
]


def symmetric(nrow, specs={}):
    return

def homogeneous(nrow, specs={}):
    dir_idx = specs.get('phi', 4)

    npop = np.power(nrow, 2)
    landscape = np.ones(npop, dtype=int) * dir_idx
    return landscape


def random(nrow, specs={}):
    seed = specs.get('seed', 0)

    np.random.seed(seed)
    npop = np.power(nrow, 2)
    landscape = np.random.randint(8, size=npop)
    return landscape

def tiled(nrow, specs={}):
    seed = specs.get('seed', 0)
    tile_size = specs.get('tile_size', 10)

    np.random.seed(seed)
    ncol_dir = nrow / tile_size
    didx = np.random.randint(0, 8, size=[ncol_dir, ncol_dir])
    landscape = np.repeat(np.repeat(didx, tile_size, 0), tile_size, 1)
    return landscape.ravel()


def Perlin(nrow, specs={}):
    size = specs.get('size', 5)
    assert(size > 0)

    x = y = np.linspace(0, size, nrow)
    n = [[noise.pnoise2(i, j, repeatx=size, repeaty=size) for j in y] for i in x]
    m = n - np.min(n)
    m /= np.max(m)
    landscape = np.array(np.round(m * 7), dtype=int)
    return landscape.ravel()


def Perlin_uniform(nrow, specs={}):
    size = specs.get('size', 5)
    assert(size > 0)

    nrow = 100
    size = 4
    x = y = np.linspace(0, size, nrow)
    n = [[noise.pnoise2(i, j, repeatx=size, repeaty=size) for j in y] for i in x]
    m = np.concatenate(n)
    sorted_idx = np.argsort(m)
    max_val = nrow * 2
    idx = len(m) // max_val
    for ii, val in enumerate(range(max_val)):
        m[sorted_idx[ii * idx:(ii + 1) * idx]] = val
    landscape = (m - nrow) / nrow
    return landscape


def move(nrow):
    return np.array([1, nrow + 1, nrow, nrow - 1, -1, -nrow - 1, -nrow, -nrow + 1])