import inspect
import os

from numpy import isnan
import pandas as pd
from pandas.util.testing import network
import pytest

from pvlib.iotools import srml


test_dir = os.path.dirname(
    os.path.abspath(inspect.getfile(inspect.currentframe())))
srml_testfile = os.path.join(test_dir, '../data/SRML-day-EUPO1801.txt')


def test_read_srml():
    srml.read_srml(srml_testfile)


@network
def test_read_srml_remote():
    srml.read_srml('http://solardat.uoregon.edu/download/Archive/EUPO1801.txt')


def test_read_srml_columns_exist():
    data = srml.read_srml(srml_testfile)
    assert 'ghi_0' in data.columns
    assert 'ghi_0_flag' in data.columns
    assert 'dni_1' in data.columns
    assert 'dni_1_flag' in data.columns
    assert '7008' in data.columns
    assert '7008_flag' in data.columns


def test_read_srml_nans_exist():
    data = srml.read_srml(srml_testfile)
    assert isnan(data['dni_0'][1119])
    assert data['dni_0_flag'][1119] == 99


@pytest.mark.parametrize('url,year,month', [
    ('http://solardat.uoregon.edu/download/Archive/EUPO1801.txt',
     2018, 1),
    ('http://solardat.uoregon.edu/download/Archive/EUPO1612.txt',
     2016, 12),
])
def test_read_srml_dt_index(url, year, month):
    data = srml.read_srml(url)
    start = pd.Timestamp('{:04d}{:02d}01 00:00'.format(year, month))
    start = start.tz_localize('Etc/GMT+8')
    end = pd.Timestamp('{:04d}{:02d}31 23:59'.format(year, month))
    end = end.tz_localize('Etc/GMT+8')
    assert data.index[0] == start
    assert data.index[-1] == end
    assert (data.index[59::60].minute == 59).all()
    assert str(year) not in data.columns


@pytest.mark.parametrize('column,expected', [
    ('1001', 'ghi_1'),
    ('7324', '7324'),
    ('2001', '2001'),
    ('2017', 'dni_7')
])
def test_map_columns(column, expected):
    assert srml.map_columns(column) == expected


@network
def test_read_srml_month_from_solardat():
    url = 'http://solardat.uoregon.edu/download/Archive/EUPO1801.txt'
    file_data = srml.read_srml(url)
    requested = srml.read_srml_month_from_solardat('EU', 2018, 1)
    assert file_data.equals(requested)


@network
def test_15_minute_dt_index():
    data = srml.read_srml_month_from_solardat('TW', 2019, 4, 'RQ')
    start = pd.Timestamp('20190401 00:00')
    start = start.tz_localize('Etc/GMT+8')
    end = pd.Timestamp('20190430 23:45')
    end = end.tz_localize('Etc/GMT+8')
    assert data.index[0] == start
    assert data.index[-1] == end
    assert (data.index[3::4].minute == 45).all()


@network
def test_hourly_dt_index():
    data = srml.read_srml_month_from_solardat('CD', 1986, 4, 'PH')
    start = pd.Timestamp('19860401 00:00')
    start = start.tz_localize('Etc/GMT+8')
    end = pd.Timestamp('19860430 23:00')
    end = end.tz_localize('Etc/GMT+8')
    assert data.index[0] == start
    assert data.index[-1] == end
    assert (data.index.minute == 0).all()
