using NUnit.Framework;
using NFC;
using NFC.Readers.PCSC;
using NFC.Mifare_DESFire;
using NFC.Mifare_DESFire.Enums;
using System;
using System.Text;

namespace NFC_Test
{
    [TestFixture, Explicit]
    public class OTA
    {
        private string _ReaderID = "ACS ACR122U PICC Interface 0";

        [Test]
        public void Init()
        {
            IHardware hardware = new Hardware();
            IReader reader = hardware.OpenReader(_ReaderID);

            bool transmit_successfully = false;

            ReaderEventHandler handler = (sender, card) =>
            {
                card.Connect();

                MIFARE_DESFire desfire = new MIFARE_DESFire(card);

                desfire.SelectApplication(0x000000);
                desfire.AuthenticateISO_DES(0x00, desfire.GenerateEmptyKey(16));
                desfire.Format();

                desfire.AuthenticateISO_DES(0x00, desfire.GenerateEmptyKey(16));

                byte keySetting1 = desfire.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.NOKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE);
                byte keySetting2 = desfire.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 0x03);
                desfire.CreateApplication(0xC0FFEE, keySetting1, keySetting2);

                desfire.SelectApplication(0xC0FFEE);
                desfire.AuthenticateISO_AES(0x00, desfire.GenerateEmptyKey(16));

                byte[] key_master = desfire.ConvertFromHexString("45eeb8338ae8f49a032e85bb11143530");
                byte[] key_1 = desfire.ConvertFromHexString("8db1f942f2d7cc82f6fa1486a30f8c12");
                byte[] key_2 = desfire.ConvertFromHexString("77611d170c449df6f294c48581ab315d");
                desfire.ChangeKey_AES(0x00, key_master, 0x10);

                desfire.AuthenticateISO_AES(0x00, key_master);
                desfire.ChangeOtherKey_AES(0x01, key_1, desfire.GenerateEmptyKey(16), 0x10);

                desfire.AuthenticateISO_AES(0x00, key_master);
                desfire.ChangeOtherKey_AES(0x02, key_2, desfire.GenerateEmptyKey(16), 0x10);

                UInt16 accesRights = desfire.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00);
                desfire.CreateFile_Standard(0x01, FileCommunication.PLAIN, accesRights, 0x100);

                desfire.WriteData(0x01, 0, Encoding.ASCII.GetBytes("user@domain.org"));

                byte[] data = desfire.ReadData(0x01, 0, 32);

                Console.WriteLine(Encoding.ASCII.GetString(data));

                transmit_successfully = true;

                card.Disconnect();
            };

            reader.CardDiscovered += handler;
            reader.Start();

            Assert.AreEqual(true, transmit_successfully);

            reader.Stop();
            reader.CardDiscovered -= handler;
        }
    }
}