# Licensed under a 3-clause BSD style license - see LICENSE.rst
# -*- coding: utf-8 -*-

import pytest

asdf = pytest.importorskip('asdf')

from astropy.table import Table


def make_table():

    a = [1, 4, 5]
    b = [2.0, 5.0, 8.2]
    c = ['x', 'y', 'z']
    return Table([a, b, c], names=('a', 'b', 'c'), meta={'name': 'first table'})


def test_table_io(tmpdir):

    tmpfile = str(tmpdir.join('table.asdf'))

    table = make_table()

    table.write(tmpfile)

    # Simple sanity check using ASDF directly
    with asdf.open(tmpfile) as af:
        assert 'data' in af.keys()
        assert isinstance(af['data'], Table)
        assert all(af['data'] == table)

    # Now test using the table reader
    new_t = Table.read(tmpfile)
    assert all(new_t == table)


def test_table_io_custom_key(tmpdir):

    tmpfile = str(tmpdir.join('table.asdf'))

    table = make_table()

    table.write(tmpfile, data_key='something')

    # Simple sanity check using ASDF directly
    with asdf.open(tmpfile) as af:
        assert 'something' in af.keys()
        assert 'data' not in af.keys()
        assert isinstance(af['something'], Table)
        assert all(af['something'] == table)

    # Now test using the table reader
    with pytest.raises(KeyError):
        new_t = Table.read(tmpfile)

    new_t = Table.read(tmpfile, data_key='something')
    assert all(new_t == table)


def test_table_io_custom_tree(tmpdir):

    tmpfile = str(tmpdir.join('table.asdf'))

    table = make_table()

    def make_custom_tree(tab):
        return dict(foo=dict(bar=tab))

    table.write(tmpfile, make_tree=make_custom_tree)

    # Simple sanity check using ASDF directly
    with asdf.open(tmpfile) as af:
        assert 'foo' in af.keys()
        assert 'bar' in af['foo']
        assert 'data' not in af.keys()
        assert all(af['foo']['bar'] == table)

    # Now test using table reader
    with pytest.raises(KeyError):
        new_t = Table.read(tmpfile)

    def find_table(asdffile):
        return asdffile['foo']['bar']

    new_t = Table.read(tmpfile, find_table=find_table)
    assert all(new_t == table)
