using System;
using System.Collections.Generic;

namespace ZeroLevel.DocumentObjectModel
{
    public interface IMetadataReader<T>
    {
        void ReadId(Guid Id);

        void ReadSummary(string summary);

        void ReadHeader(string header);

        void EnterIdentifier(Identifier identifier);

        void ReadVersion(int version);

        void ReadTimestamp(long timestamp);

        void ReadDateLabel(string datelabel);

        void LeaveIdentifier(Identifier identifier);

        void EnterTagsBlock(TagMetadata tagBlock);

        void EnterKeywords(IEnumerable<string> keywords);

        void ReadKeyword(string keyword, int order);

        void LeaveKeywords(IEnumerable<string> keywords);

        void EnterPlaces(IEnumerable<Tag> places);

        void ReadPlace(Tag place, int order);

        void LeavePlaces(IEnumerable<Tag> places);

        void EnterCompanies(IEnumerable<Tag> companies);

        void ReadCompany(Tag company, int order);

        void LeaveCompanies(IEnumerable<Tag> companies);

        void EnterPersons(IEnumerable<Tag> persons);

        void ReadPerson(Tag person, int order);

        void LeavePersons(IEnumerable<Tag> persons);

        void LeaveTagsBlock(TagMetadata tagBlock);

        void EnterDescriptioveBlock(DescriptiveMetadata metadata);

        void ReadAuthors(string byline);

        void ReadCopiright(string copyright);

        void ReadCreated(DateTime created);

        void ReadLanguage(string language);

        void ReadPriority(Priority priority);

        void ReadSource(Agency source);

        void ReadPublisher(Agency publisher);

        void ReadOriginal(Tag original);

        void EnterHeaders(IEnumerable<Header> headers);

        void ReadHeader(Header header, int order);

        void LeaveHeaders(IEnumerable<Header> headers);

        void LeaveDescriptioveBlock(DescriptiveMetadata metadata);

        void EnterAsides(IEnumerable<AttachContent> asides);

        void ReadAside(AttachContent aside, int order);

        void LeaveAsides(IEnumerable<AttachContent> asides);

        void EnterAssotiations(IEnumerable<Assotiation> assotiations);

        void ReadAssotiation(Assotiation assotiation, int order);

        void LeaveAssotiations(IEnumerable<Assotiation> assotiations);

        void EnterCategories(IEnumerable<Category> categories);

        void ReadCategory(Category category, int order);

        void LeaveCategories(IEnumerable<Category> categories);

        T Complete();
    }
}