from decimal import Decimal

import pytest

from fin_defs import DKK, USD, AssetAmount, FiatCurrency
from fin_defs.parse_price import parse_price


def dkk(amount):
    return AssetAmount(DKK, Decimal(amount))


PRICES_PARSABLE = [
    ('DKK100', dkk(100)),
    ('100;-', dkk(100)),
    ('100 kr', dkk(100)),
    ('    100 kr     ', dkk(100)),
    ('349.-', dkk(349)),
    ('90,- kr', dkk(90)),
    ('3.000 kr.', dkk(3000)),
    ('3.000.000 kr.', dkk(3_000_000)),
    ('3.000.000,25 kr.', dkk(3_000_000.25)),
    ('3,000 kr.', dkk(3000)),
    ('3,000,000 kr.', dkk(3_000_000)),
    ('3,000,000.25 kr.', dkk(3_000_000.25)),
    ('25,00 kr.', dkk(25)),
    ('300,00 kr.', dkk(300)),
    ('300kr.', dkk(300)),
    ('300kr', dkk(300)),
    ('5,00 dkk', dkk(5)),
    ('9,99 dkk', dkk('9.99')),
    ('17900 kr', dkk(17900)),
    ('650 kr.', dkk(650)),
    ('3 650 kr.', dkk(3_650)),
    ('3 650 DKK', dkk(3_650)),
    ('3 650 650 kr.', dkk(3_650_650)),
    ('3 650 650 DKK', dkk(3_650_650)),
    ('3 650 kr.', dkk(3_650)),
    ('3 650 DKK', dkk(3_650)),
    ('3 650 650 kr.', dkk(3_650_650)),
    ('3 650 650 DKK', dkk(3_650_650)),
    ('2 998 kr', dkk(2998)),
]

PRICES_UNPARSABLE = [
    '007',
]


@pytest.mark.parametrize(('price_string', 'parsed_amount'), PRICES_PARSABLE)
def test_parse_price(price_string: str, parsed_amount: AssetAmount):
    result = parse_price(price_string, FiatCurrency.JPY)
    assert result == parsed_amount


@pytest.mark.parametrize('price_string', PRICES_UNPARSABLE)
def test_parse_unparsable(price_string: str):
    assert parse_price(price_string, USD) is None


def parse_asset_amount(text: str) -> AssetAmount:
    return parse_price(text, FiatCurrency.JPY)


def test_parse_asset_amount_dkk():
    assert parse_asset_amount('1338 DKK').amount == 1338
    assert parse_asset_amount('1338,00 DKK').amount == 1338
    assert parse_asset_amount('13,38 DKK').amount == Decimal('13.38')
    assert parse_asset_amount('13.38 DKK').amount == Decimal('13.38')
    assert parse_asset_amount('1338,00. DKK').amount == 1338
    assert parse_asset_amount('99,00 kr.').amount == 99

    assert parse_asset_amount('kr 825.00').amount == 825
    assert parse_asset_amount('kr 825.00').asset == DKK
    assert parse_asset_amount('kr 825,00').amount == 825
    assert parse_asset_amount('kr 825,00').asset == DKK
    assert parse_asset_amount('kr. 825.00').amount == 825
    assert parse_asset_amount('kr. 825.00').asset == DKK


def test_parse_asset_amount_usd():
    assert parse_asset_amount('$99').amount == 99
    assert parse_asset_amount('$99').asset == USD

    assert parse_asset_amount('99$ USD').amount == 99
    assert parse_asset_amount('99$ USD').asset == USD