# -*- coding: utf-8 -*-

import pytest

import datetime
import dingguo
import yaml
import os

project_root_path = os.path.realpath(os.path.join(__file__, '..', '..'))
test_data_path = os.path.join(project_root_path, 'tests', 'data')

def test_order_dict_repr():

    order = dingguo.Order(
            platform = u'platform',
            order_id = u'id',
            order_date = datetime.datetime(2016, 5, 8, 0, 18, 17),
            customer_id = u'customer',
            )

    item_0 = dingguo.Item(name = u'item 0', price_brutto = dingguo.Sum(1.0, u'EUR'))
    order.items.append(item_0)
    item_1 = dingguo.Item(name = u'item 1', price_brutto = dingguo.Sum(2.0, u'EUR'))
    order.items.append(item_1)

    discount_0 = dingguo.Discount(name = u'discount 0', amount = dingguo.Sum(3.0, u'EUR'))
    order.discounts.append(discount_0)
    discount_1 = dingguo.Discount(name = u'discount 1', amount = dingguo.Sum(4.0, u'EUR'))
    order.discounts.append(discount_1)

    assert order.dict_repr() == {
            'articles': [item_0, item_1],
            'customer_id': u'customer',
            'discounts': [discount_0, discount_1],
            'order_date': u'2016-05-08',
            'order_id': u'id',
            'platform': u'platform',
            }

def test_order_from_dict_flat():

    item_0 = dingguo.Item(name = u'item 0', price_brutto = dingguo.Sum(1.0, u'EUR'))
    item_1 = dingguo.Item(name = u'item 1', price_brutto = dingguo.Sum(2.0, u'EUR'))
    discount_0 = dingguo.Discount(name = u'discount 0', amount = dingguo.Sum(3.0, u'EUR'))
    discount_1 = dingguo.Discount(name = u'discount 1', amount = dingguo.Sum(4.0, u'EUR'))

    order = dingguo.Order.from_dict({
            'articles': [item_0, item_1],
            'customer_id': u'customer',
            'discounts': [discount_0, discount_1],
            'order_date': u'2016-05-08',
            'order_id': u'id',
            'platform': u'platform',
            })

    assert order.items == [item_0, item_1]
    assert order.customer_id == u'customer'
    assert order.discounts == [discount_0, discount_1]
    assert order.order_date == datetime.date(2016, 5, 8)
    assert order.order_id == u'id'
    assert order.platform == u'platform'

def test_order_from_dict_tree():

    order = dingguo.Order.from_dict({
            'articles': [
                {
                    'name': u'item 0',
                    'price_brutto': 1.0,
                    'price_brutto_currency': u'EUR',
                    },
                {
                    'name': u'item 1',
                    'price_brutto': 2.0,
                    'price_brutto_currency': u'EUR',
                    },
                ],
            'customer_id': u'customer',
            'discounts': [
                {
                    'name': u'discount 0',
                    'value': 3.0,
                    'value_currency': u'EUR',
                    },
                {
                    'name': u'discount 1',
                    'value': 4.0,
                    'value_currency': u'EUR',
                    },
                ],
            'order_date': u'2016-05-08',
            'order_id': u'id',
            'platform': u'platform',
            })

    assert order.items == [
            dingguo.Item(name = u'item 0', price_brutto = dingguo.Sum(1.0, u'EUR')),
            dingguo.Item(name = u'item 1', price_brutto = dingguo.Sum(2.0, u'EUR')),
            ]
    assert order.customer_id == u'customer'
    assert order.discounts == [
            dingguo.Discount(name = u'discount 0', amount = dingguo.Sum(3.0, u'EUR')),
            dingguo.Discount(name = u'discount 1', amount = dingguo.Sum(4.0, u'EUR')),
            ]
    assert order.order_date == datetime.date(2016, 5, 8)
    assert order.order_id == u'id'
    assert order.platform == u'platform'

def test_figure_eq():
    assert dingguo.Figure(1, u'mm') == dingguo.Figure(1, u'mm')

def test_figure_eq_inverted():
    assert not dingguo.Figure(1, u'mm') == dingguo.Figure(2, u'mm')

def test_figure_ne():
    assert dingguo.Figure(1, u'mm') != dingguo.Figure(2, u'mm')

def test_figure_ne_inverted():
    assert not dingguo.Figure(1, u'mm') != dingguo.Figure(1, u'mm')

def test_item_eq():
    item_a = dingguo.Item(
            name = u'item',
            price_brutto = dingguo.Sum(1.0, u'EUR'),
            )
    item_b = dingguo.Item(
            name = u'item',
            price_brutto = dingguo.Sum(1.0, u'EUR'),
            )
    assert item_a == item_b

def test_item_eq_inverted():
    item_a = dingguo.Item(
            name = u'item',
            price_brutto = dingguo.Sum(1.0, u'EUR'),
            )
    item_b = dingguo.Item(
            name = u'item',
            price_brutto = dingguo.Sum(2.0, u'EUR'),
            )
    assert not item_a == item_b

def test_item_ne():
    item_a = dingguo.Item(
            name = u'item',
            price_brutto = dingguo.Sum(1.0, u'EUR'),
            )
    item_b = dingguo.Item(
            name = u'item',
            price_brutto = dingguo.Sum(2.0, u'EUR'),
            )
    assert item_a != item_b

def test_item_ne_inverted():
    item_a = dingguo.Item(
            name = u'item',
            price_brutto = dingguo.Sum(1.0, u'EUR'),
            )
    item_b = dingguo.Item(
            name = u'item',
            price_brutto = dingguo.Sum(1.0, u'EUR'),
            )
    assert not item_a != item_b

def test_discount_eq():
    discount_a = dingguo.Discount(
            name = u'discount',
            amount = dingguo.Sum(1.0, u'EUR'),
            )
    discount_b = dingguo.Discount(
            name = u'discount',
            amount = dingguo.Sum(1.0, u'EUR'),
            )
    assert discount_a == discount_b

def test_discount_eq_inverted():
    discount_a = dingguo.Discount(
            name = u'discount',
            amount = dingguo.Sum(1.0, u'EUR'),
            )
    discount_b = dingguo.Discount(
            name = u'discount',
            amount = dingguo.Sum(2.0, u'EUR'),
            )
    assert not discount_a == discount_b

def test_discount_ne():
    discount_a = dingguo.Discount(
            name = u'discount',
            amount = dingguo.Sum(1.0, u'EUR'),
            )
    discount_b = dingguo.Discount(
            name = u'discount',
            amount = dingguo.Sum(2.0, u'EUR'),
            )
    assert discount_a != discount_b

def test_discount_ne_inverted():
    discount_a = dingguo.Discount(
            name = u'discount',
            amount = dingguo.Sum(1.0, u'EUR'),
            )
    discount_b = dingguo.Discount(
            name = u'discount',
            amount = dingguo.Sum(1.0, u'EUR'),
            )
    assert not discount_a != discount_b

def test_item_from_dict():

    item = dingguo.Item.from_dict({
            'name': u'item',
            'price_brutto': 1.0,
            'price_brutto_currency': u'EUR',
            })

    assert item.name == u'item'
    assert item.price_brutto == dingguo.Sum(1.0, u'EUR')

def test_discount_from_dict():

    discount = dingguo.Discount.from_dict({
            'name': u'discount',
            'value': 1.0,
            'value_currency': u'EUR',
            })

    assert discount.name == u'discount'
    assert discount.amount == dingguo.Sum(1.0, u'EUR')