using System;
using System.Data;
using System.Data.SqlClient;

namespace Baza_Reklam.Classes.Helpers
{
    public class ProvisionHelper
    {
        private readonly string _connectionString;

        public ProvisionHelper(string connectionString)
        {
            _connectionString = connectionString;
        }

        public bool IsProvisionBlocked(int agencyId, int year, int month, bool isKierownik)
        {
            //jesli to nie kierownik to blokuj prowizje
            if (!isKierownik) return true;

            if (IsProvisionBlockedInDb(agencyId, year, month))
                return true;

            //jesli aktualny rok i miesiac poprzedni lub mlodszy to pozwol na edycje
            if (year == DateTime.Today.Year && month >= DateTime.Today.Month - 1) return false;

            //jesli rok wiekszy o 1 niz aktalny i aktualny miesiac to styczen oraz wybrany miesiac to grudzien poprzedniego roku to pozwol na edycje
            if (year == DateTime.Today.Year - 1 && month == 12 && DateTime.Today.Month == 1) return false;

            //jezeli wiekszy rok lub rowny rok a wiekszy miesiac - czyli przyszly okres
            if (year > DateTime.Today.Year ||
                year == DateTime.Today.Year && month >= DateTime.Today.Month)
                return false;

            //w innych przypadkach blokuj prowizje
            return true;
        }


        public bool IsProvisionBlockedInDb(int agencyId, int year, int month)
        {
            SqlConnection conn = null;
            SqlCommand cmd = null;

            try
            {
                //sprawdz czy prowizja dla danej agencji nie zostala zablokowana przez kogos z ksiegowosci
                conn = new SqlConnection(_connectionString);
                cmd = new SqlCommand("sp_IsProvisionBlocked", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@agencyId", agencyId);
                cmd.Parameters.AddWithValue("@year", year);
                cmd.Parameters.AddWithValue("@month", month);

                conn.Open();

                object isBlocked = cmd.ExecuteScalar();
                return Convert.ToBoolean(isBlocked);
            }
            finally
            {
                if (cmd != null) cmd.Dispose();

                if (conn != null)
                {
                    conn.Close();
                    conn.Dispose();
                }
            }
        }

        public void SetProvision(bool isBlocked, int agencyId, int year, int month, string userName)
        {
            SqlConnection conn = null;
            SqlCommand cmd = null;

            try
            {
                conn = new SqlConnection(_connectionString);
                cmd = new SqlCommand("sp_SetProvision", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@isBlocked", isBlocked);
                cmd.Parameters.AddWithValue("@agencyId", agencyId);
                cmd.Parameters.AddWithValue("@year", year);
                cmd.Parameters.AddWithValue("@month", month);
                cmd.Parameters.AddWithValue("@userName", userName);

                conn.Open();

                cmd.ExecuteNonQuery();
            }
            finally
            {
                if (cmd != null) cmd.Dispose();

                if (conn != null)
                {
                    conn.Close();
                    conn.Dispose();
                }
            }
        }
    }
}