using System;
using System.Threading;
using CoreNFC;
using Foundation;
using NFC;
using NFC.ISO7816_4;

namespace Borepin.iOS.CNFC
{
    public class Card : ICard
    {
        private NFCTagReaderSession _session;
        private INFCMiFareTag _tag;

        public Card(NFCTagReaderSession session, INFCMiFareTag tag)
        {
            _session = session;
            _tag = tag;
        }

        public void Connect()
        {
            var counter = new CountdownEvent(1);
            NSError err = null;

            _session.ConnectTo(_tag, (error) =>
            {
                err = error;
                counter.Signal();
            });

            counter.Wait();

            if (err != null)
            {
                throw new Exception(err.LocalizedDescription);
            }
        }

        public void Disconnect()
        {
            // TODO: decide on which should be used
            //_session.RestartPolling();
            _session.InvalidateSession("card disconnect");
        }

        public APDUResponse Transmit(APDUCommand cmd)
        {
            var counter = new CountdownEvent(1);
            byte[] buf = null;

            _tag.SendMiFareIso7816Command(new NFCIso7816Apdu(NSData.FromArray(cmd.Data)), (response, sw1, sw2, NSError) =>
            {
                // reassembly the original apdu message
                buf = new byte[response.Length + 2];
                response.ToArray().CopyTo(buf, 0);
                buf[response.Length + 0] = sw1;
                buf[response.Length + 1] = sw2;
                counter.Signal();
            });

            counter.Wait();

            return new APDUResponse(buf);
        }
    }
}