using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GreenTree.Nachtragsmanagement.Core.Domain.Appendix;
using GreenTree.Nachtragsmanagement.Core.Domain.Invoice;

namespace GreenTree.Nachtragsmanagement.Services.Appendix
{
    public interface IAppendixService
    {
        #region Appendix

        /// <summary>
        /// Gets all appendices
        /// </summary>
        IList<Core.Domain.Appendix.Appendix> GetAllAppendices();

        /// <summary>
        /// Gets all appendices where the user is assigned to the corresponding site if the current role only allows assigned sites
        /// </summary>
        IList<Core.Domain.Appendix.Appendix> GetAllUserAssignedAppendices(Core.Domain.User.User user);

        /// <summary>
        /// Gets a appendix by specified Id
        /// </summary>
        /// <param name="id">Appendix identifier.</param>
        Core.Domain.Appendix.Appendix GetAppendixById(int id);

        /// <summary>
        /// Gets all appendices to the specified ids
        /// </summary>
        IList<Core.Domain.Appendix.Appendix> GetAppendicesByIds(int[] ids);

        /// <summary>
        /// Gets a appendix by specified customer number
        /// </summary>
        /// <param name="customNumber">Customer number.</param>
        Core.Domain.Appendix.Appendix GetAppendixByCustomNumber(string customNumber);

        /// <summary>
        /// Insert a appendix
        /// </summary>
        /// <param name="appendix">Appendix.</param>
        void InsertAppendix(Core.Domain.Appendix.Appendix appendix);

        /// <summary>
        /// Update a appendix
        /// </summary>
        /// <param name="appendix">Appendix.</param>
        void UpdateAppendix(Core.Domain.Appendix.Appendix appendix);

        /// <summary>
        /// Delete a appendix
        /// </summary>
        /// <param name="appendix">Appendix.</param>
        void DeleteAppendix(Core.Domain.Appendix.Appendix appendix);

        #endregion

        #region Category

        /// <summary>
        /// Gets all categories
        /// </summary>
        IList<Category> GetAllCategories();

        /// <summary>
        /// Gets a category by specified Id
        /// </summary>
        /// <param name="id">Category identifier.</param>
        Category GetCategoryById(int id);

        /// <summary>
        /// Gets all categories to the specified ids
        /// </summary>
        IList<Category> GetCategoriesByIds(int[] ids);

        /// <summary>
        /// Insert a category
        /// </summary>
        /// <param name="category">Category.</param>
        void InsertCategory(Category category);

        /// <summary>
        /// Update a category
        /// </summary>
        /// <param name="category">Category.</param>
        void UpdateCategory(Category category);

        /// <summary>
        /// Delete a category
        /// </summary>
        /// <param name="category">Category.</param>
        void DeleteCategory(Category category);

        #endregion

        #region Invoice

        /// <summary>
        /// Gets all invoices
        /// </summary>
        IList<Invoice> GetAllInvoices();

        /// <summary>
        /// Gets a invoice by specified Id
        /// </summary>
        /// <param name="id">Invoice identifier.</param>
        Invoice GetInvoiceById(int id);

        /// <summary>
        /// Gets all invoices to the specified ids
        /// </summary>
        IList<Invoice> GetInvoicesByIds(int[] ids);

        /// <summary>
        /// Insert a invoice
        /// </summary>
        /// <param name="invoice">Invoice.</param>
        void InsertInvoice(Invoice invoice);

        /// <summary>
        /// Update a invoice
        /// </summary>
        /// <param name="invoice">Invoice.</param>
        void UpdateInvoice(Invoice invoice);

        /// <summary>
        /// Delete a invoice
        /// </summary>
        /// <param name="invoice">Invoice.</param>
        void DeleteInvoice(Invoice invoice);

        #endregion

        #region State

        /// <summary>
        /// Gets all states
        /// </summary>
        IList<State> GetAllStates();

        /// <summary>
        /// Gets a state by specified Id
        /// </summary>
        /// <param name="id">State identifier.</param>
        State GetStateById(int id);

        /// <summary>
        /// Gets all states to the specified ids
        /// </summary>
        IList<State> GetStatesByIds(int[] ids);

        /// <summary>
        /// Gets all appendices to the specified with the specified status id
        /// </summary>
        /// <param name="id">State identifier.</param>
        IList<Core.Domain.Appendix.Appendix> GetAppendicesByState(int id);

        /// <summary>
        /// Gets the state which is defaultly selected
        /// </summary>
        State GetDefaultState();

        /// <summary>
        /// Gets the state which is marked as finish
        /// </summary>
        State GetFinishState();

        /// <summary>
        /// Insert a state
        /// </summary>
        /// <param name="state">State.</param>
        void InsertState(State state);

        /// <summary>
        /// Update a state
        /// </summary>
        /// <param name="state">State.</param>
        void UpdateState(State state);

        /// <summary>
        /// Delete a state
        /// </summary>
        /// <param name="state">State.</param>
        void DeleteState(State state);

        #endregion
    }
}