# coding=utf-8
"""Utilities / Functions related to ISO 7816-4

(C) 2022 by Harald Welte <laforge@osmocom.org>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""

from construct import *
from pySim.construct import *
from pySim.utils import *
from pySim.filesystem import *
from pySim.tlv import *

# Table 91 + Section 8.2.1.2


class ApplicationId(BER_TLV_IE, tag=0x4f):
    _construct = GreedyBytes

# Table 91


class ApplicationLabel(BER_TLV_IE, tag=0x50):
    _construct = GreedyBytes

# Table 91 + Section 5.3.1.2


class FileReference(BER_TLV_IE, tag=0x51):
    _construct = GreedyBytes

# Table 91


class CommandApdu(BER_TLV_IE, tag=0x52):
    _construct = GreedyBytes

# Table 91


class DiscretionaryData(BER_TLV_IE, tag=0x53):
    _construct = GreedyBytes

# Table 91


class DiscretionaryTemplate(BER_TLV_IE, tag=0x73):
    _construct = GreedyBytes

# Table 91 + RFC1738 / RFC2396


class URL(BER_TLV_IE, tag=0x5f50):
    _construct = GreedyString('ascii')

# Table 91


class ApplicationRelatedDOSet(BER_TLV_IE, tag=0x61):
    _construct = GreedyBytes

# Section 8.2.1.3 Application Template


class ApplicationTemplate(BER_TLV_IE, tag=0x61, nested=[ApplicationId, ApplicationLabel, FileReference,
                          CommandApdu, DiscretionaryData, DiscretionaryTemplate, URL,
                          ApplicationRelatedDOSet]):
    pass
