using System;
using CoreFoundation;
using CoreNFC;
using Foundation;
using NFC;

namespace Borepin.iOS.CNFC
{
    public class Reader : NFCTagReaderSessionDelegate, IReader
    {
        public event ReaderEventHandler CardDiscovered;
        public event ReaderEventHandler CardLost;

        private NFCReaderSession _session = null;
        private DispatchQueue _queue;

        public void Start()
        {
            _queue = new DispatchQueue("NFC Reader Queue", true);

            // sessions cannot be reused
            _session = new NFCTagReaderSession(NFCPollingOption.Iso14443, this, _queue)
            {
                AlertMessage = "TODO",
            };

            if (_session == null)
            {
                Console.WriteLine("Oh no! The session is null!");
            }

            _session.BeginSession();
        }

        public void Stop()
        {
            _session?.InvalidateSession();
            _session = null;
        }

        public override void DidDetectTags(NFCTagReaderSession session, INFCTag[] tags)
        {
            Console.WriteLine("Did detect tags");

            Console.WriteLine(tags[0].Type);

            //INFCIso7816Tag tag = tags[0].GetNFCIso7816Tag();
            INFCMiFareTag tag = tags[0].GetNFCMiFareTag();
            if (tag != null)
            {
                Console.WriteLine("Card ist valid");
                CardDiscovered?.Invoke(this, new Card(session, tag));
            }
            else
            {
                Console.WriteLine("Card is not ISO7816");
            }
        }

        public override void DidInvalidate(NFCTagReaderSession session, NSError error)
        {
            // TODO: decide what to do
            Console.WriteLine("reader session invalidated");
        }

    }
}