using System;
using System.Collections.Generic;
using System.ServiceModel;

using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;

namespace BeWo.Service.ServiceContracts
{
    [ServiceContract]
    [ServiceKnownType(typeof(List<object>))]
    [ServiceKnownType(typeof(List<string>))]
    public interface ICustomerService
    {
        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void ArchiveCustomer(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void ArchivePerson(long pOid, long pVersion);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		void ArchiveOrganisation(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void ArchiveSupportConcept(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateAbsenceReason(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateAbsenceReasons(Dictionary<long, long> pOid2Version);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateCustomer(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateOrganisation(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateOrganisations(Dictionary<long, long> pOid2Version);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivatePerson(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivatePersons(Dictionary<long, long> pOid2Version);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateSupportConcept(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateSupportConcepts(Dictionary<long, long> pOid2Version);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeleteAbsenceReason(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeleteAbsenceReasons(Dictionary<long, long> pOid2Version);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeleteCustomer(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeleteCustomers(Dictionary<long, long> pOid2Version);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeleteCustomersAbsenceTime(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeleteCustomersAbsenceTimes(long pCustomerOid, Dictionary<long, long> pOid2Version);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactCustomerDC> FindCustomer(string pFirstName, string pLastName, string pReferenceNumber);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactOrganisationDC> FindOrganisation(string pName, bool pOnlyCostBearer);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactPersonDC> FindPerson(string pFirstName, string pLastName, DateTime? pDateOfBirth, PersonType? pPersonType);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactSupportConceptDC> FindSupportConcept(string pCustomerFirstName, string pCustomerLastName, string pCustomerReferenceNumber, DateTime? pFrom, DateTime? pTill);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<AbsenceReasonDC> GetAllAbsenceReasons();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactCustomerDC> GetAllActiveAndArchivedCustomersCompact(long currentEmployeeOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactPersonDC> GetAllActiveAndArchivedPersonsByTypeCompact(PersonType pType);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactPersonDC> GetAllActiveAndArchivedPersonsCompact();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactSupportConceptDC> GetAllActiveAndArchivedSupportConceptsCompact(long currentEmployeeOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactCustomerDC> GetAllActiveCustomersCompact(bool fetchReferenceNumbers, long? currentEmployeeOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactPersonDC> GetAllActivePersonsByTypeCompact(PersonType pType);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactPersonDC> GetAllActivePersonsCompact();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactSupportConceptDC> GetAllActiveSupportConceptsCompact();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactOrganisationDC> GetAllCostBearerCompact();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactOrganisationDC> GetAllActiveOrganisationsCompact();

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		List<CompactOrganisationDC> GetAllActiveAndArchivedOrganisationsCompact();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void ArchiveWohnheim(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactWohnheimDC> GetAllActiveAndArchivedWohnheimCompact();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactWohnheimDC> GetLastOpenedWohnheim();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateWohnheim(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        long UpdateWohnheim(WohnheimDC dc);
        
        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        long InsertNewWohnheim(WohnheimDC pWohnheimDC);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        WohnheimDC LoadWohnheim(long pWohnheimOid);
       
        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        CustomerDC GetCustomerWithPersonOid(long pPersonOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactCustomerDC> GetLastOpenedCustomers();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactOrganisationDC> GetLastOpenedOrganisations();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactPersonDC> GetLastOpenedPersons();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactSupportConceptDC> GetLastOpenedSupportConcepts();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void InsertAbsenceReasons(List<AbsenceReasonDC> pAbsenceReasonDC);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        long InsertNewCustomer(CustomerDC pCustomerDC);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        long InsertNewOrganisation(OrganisationDC pOrganisationDC);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        long InsertNewPerson(PersonDC pPersonDC);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        long InsertNewSupportConcept(SupportConceptDC pSupportConcept);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        CustomerDC LoadCustomer(long pCustomerOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        OrganisationDC LoadOrganisation(long pOrganisationOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        CompactOrganisationDC LoadOrganisationCompact(long pOrganisationOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        PersonDC LoadPerson(long pPersonOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        CompactPersonDC LoadPersonCompact(long pPersonOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        SupportConceptDC LoadSupportConcept(long pOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void MoveCustomerToRecycleBin(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void MovePersonToRecycleBin(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void MoveSupportConceptToRecycleBin(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void UpdateAbsenceReasons(List<AbsenceReasonDC> pAbsenceReasonDC);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        long UpdateCustomer(CustomerDC pCustomerDC);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void UpdateCustomersAbsenceTimes(long pCustomerOid, List<AbsenceTimeDC> pAbsenceTimes);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        long UpdateOrganisation(OrganisationDC pOrganisationDC);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        long UpdatePerson(PersonDC pPersonDC);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        long UpdateSupportConcept(SupportConceptDC pSupportConcept);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<AssessmentSheetCategoryDC> LoadCustomerAssessmentSheetCategoryList(long pCustomerOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<AppointmentDC> LoadAppointments(long? customerOid, long? employeeOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<AppointmentCategoryDC> GetAllAppointmentCategories();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<long> InsertNewAppointmentCategories(List<AppointmentCategoryDC> pAppointmentCategories);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<long> UpdateAppointmentCategories(List<AppointmentCategoryDC> pAppointmentCategories);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateAppointmentCategories(Dictionary<long, long> pOid2Version);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<AppointmentDC> InsertNewAppointments(List<AppointmentDC> pAppointments);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<AppointmentDC> UpdateAppointments(List<AppointmentDC> pAppointments);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateAppointments(Dictionary<long, long> pOid2Version);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<AbsenceTimeDC> InsertAbsenceTimes(List<AbsenceTimeDC> pDCList);
       
        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<AbsenceTimeDC> UpdateAbsenceTimes(List<AbsenceTimeDC> pDCList);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeactivateAbsenceTimes(Dictionary<long, long> pOid2Version);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<ValueListEntryDC> GetAllCustomerGoals(long pCustomerOid);

        [FaultContract(typeof (BeWoFault))]
        [OperationContract]
        CompactSupportConceptDC LoadCompactSupportConceptDC(long pOid, long? currentEmployeeOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        CompactCustomerDC GetCompactCustomerDC(long pOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactCustomerDC> GetAllActiveCompactCustomers();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        bool ServiceRecordOutOfSupportConcept(SupportConceptDC pSupportConcept);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CustomerDC> GetAllActiveCustomers();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CustomerDC> GetCustomersById(IEnumerable<long> idList);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<SupportConceptDC> GetSupportConceptsById(IEnumerable<long> idList);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<PersonDC> GetAllActivePersons();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<OrganisationDC> GetAllOrganisations();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<PersonDC> GetPersonsById(IEnumerable<long> idList);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<OrganisationDC> GetOrganisationsById(IEnumerable<long> idList);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<AppointmentDC> GetAppointmentsById(IEnumerable<long> idList);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		void DeactivateMedArten(Dictionary<long, long> pOid2Version);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		List<MedArtDC> GetAllMedArten();

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		List<MedArtDC> GetMedArtenById(IEnumerable<long> idList);

	    [FaultContract(typeof (BeWoFault))]
	    [OperationContract]
	    List<MedArtDC> InsertMedArten(IEnumerable<MedArtDC> pDCList);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<MedArtDC> UpdateMedArten(List<MedArtDC> pDCList);

	    [FaultContract(typeof (BeWoFault))]
	    [OperationContract]
	    List<MedikamentenverordnungDC> GetAllMedikamentenverordnungen();

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		List<MedikamentenverordnungDC> GetMedikamentenverordnungenById(IEnumerable<long> idList);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		List<MedikamentenverordnungDC> InsertMedikamentenverordnungen(List<MedikamentenverordnungDC> pDCList);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		List<MedikamentenverordnungDC> UpdateMedikamentenverordnungen(List<MedikamentenverordnungDC> pDCList);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		void DeactivateMedikamentenverordnungen();

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		List<MedikamentenverordnungDC> GetMedikamentenverordnungenForCustomer(long pCustomerOid);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    void DeleteMedArten(Dictionary<long, long> pOid2Version);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<MedikamentenverordnungslisteDC> InsertMedikamentenverordnungslisten(IEnumerable<MedikamentenverordnungslisteDC> pDCList);

	    [FaultContract(typeof (BeWoFault))]
	    [OperationContract]
	    List<SupportConceptDC> GetAllActiveSupportConceptsByCustomers(IEnumerable<long> pCustomerOids);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<CompactCustomerDC> GetCompactCustomersById(IEnumerable<long> pCustomerOids);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		List<ValueListEntryDC> GetSupportConceptGoalParents(IEnumerable<long> pParentItemOids);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    void DeleteMedikamentenverordnungsliste(long listenOid);

	    [FaultContract(typeof (BeWoFault))]
	    [OperationContract]
	    MedikamentenverordnungslisteDC UpdateMedikamentenverordnungsliste(MedikamentenverordnungslisteDC pDCList);

	    [FaultContract(typeof (BeWoFault))]
	    [OperationContract]
	    List<DarreichungsformDC> GetAllDarreichungsformen();

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
		List<DarreichungsformDC> GetDarreichungsformenById(List<long> pIds);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<DepotRhythmusDC> GetAllDepotRhythmen();

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<DepotRhythmusDC> GetDepotRhythmusById(List<long> pIds);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<CustomerDC> GetActiveCustomersById(List<long> pCustomerOids);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<CompactCustomerDC> GetAllCompactCustomers();

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<CompactCustomerDC> GetAllCustomersCompact(long currentEmployeeOid);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<CompactOrganisationDC> GetAllOrganisationsCompact();

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<CompactPersonDC> GetAllPersonsByTypeCompact(PersonType pType);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    List<CompactSupportConceptDC> GetAllSupportConceptsCompact(long currentEmployeeOid);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    void ReactivateCustomer(long pOid, long pVersion);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    void ReactivateSupportConcept(long pOid, long pVersion);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    void ReactivateOrganisation(long pOid, long pVersion);

		[FaultContract(typeof(BeWoFault))]
		[OperationContract]
	    void ReactivatePerson(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactWohnheimDC> GetAllActiveWohnheimeCompact();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<WohnheimbuchungDC> GetAllActiveWohnheimbuchungen();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        WohnheimbuchungDC GetWohnheimbuchung(long oid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        long UpdateWohnheimbuchung(WohnheimbuchungDC buchung);

        [FaultContract(typeof (BeWoFault))]
        [OperationContract]
        long InsertWohnheimbuchung(WohnheimbuchungDC buchung);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        WohnheimbuchungDC GetWohnheimbuchungByWohnheimAndBuchungsdatum(long pWohnheimOid, DateTime pBuchungsdatum);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<ServiceRecordDC> FindWohnheimbuchungsServiceRecords(long pWohnheimbuchungsOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeleteWohnheimbuchung(long pWohnheimbuchungsOid, long pWohnheimbuchungsVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<SupportConceptDC> GetAllActiveSupportConcepts();

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<long> CreateServiceRecordsFromWohnheimbuchung(long pWohnheimbuchungsOid, long pServiceDescriptionOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        ServiceDescriptionDC FindServiceDescriptionForWohnheimbuchungsServiceRecord(long pWohnheimbuchungsOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CustomerPersonRelationDC> LoadCustomerPersonRelationsByOid(IEnumerable<long> pOids);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CustomerOrganisationRelationDC> LoadCustomerOrganisationRelationsByOid(IEnumerable<long> pOids);

        [FaultContract(typeof (BeWoFault))]
        [OperationContract]
        List<long> InsertMedRecords(List<MedRecordDC> pDCList);

        [FaultContract(typeof (BeWoFault))]
        [OperationContract]
        List<MedRecordDC> GetMedRecordsForCustomer(long pCustomerOid);

        [FaultContract(typeof (BeWoFault))]
        [OperationContract]
        List<MedRecordDC> UpdateMedRecords(List<MedRecordDC> pDCList);
        
        [FaultContract(typeof (BeWoFault))]
        [OperationContract]
        void DeactivateMedRecords(Dictionary<long, long> pOid2Version);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        void DeleteMedRecord(long pOid, long pVersion);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        string AndroidGetCustomerCompact(long pCustomerOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CompactCustomerDC> GetAllChatActiveCustomersCompact();

        [FaultContract(typeof (BeWoFault))]
        [OperationContract]
        List<ChatMessageDC> FindAllChatMessages(long senderOid, long empfaengerOid);

        [FaultContract(typeof (BeWoFault))]
        [OperationContract]
        Byte[] GetCustomerImage(long customerOid);

        [FaultContract(typeof(BeWoFault))]
        [OperationContract]
        List<CustomerAPPCodeDC> GetAllCustomerAppCodes(long pCustomerOid);
    }
}