using System;
using System.Data;
using System.Data.SqlClient;
using Baza_Reklam.REKLAMADataSetTableAdapters;

namespace Baza_Reklam
{
    public class FakturaHelper
    {

        public enum PaymentType
        {
            Card = 0,
            Transfer = 1,
            Cash = 2,
            Barter = 3
        }

        public enum ClientId
        {
            Katowice = 678,
            Poznan = 18845
        }

        public enum OfficeId
        {
            Redakcja = 2,
            Katowice = 4,
            Poznan = 6
        }

        public enum OrderId
        {
            Poznan = 272,
            Katowice = 273
        }

        public enum BankAccount
        {
            CentralaPLN = 43
        }

        public static string GetPaymentType(int paymentType)
        {
            switch (paymentType)
            {
                case 0:
                    return "Karta kredytowa";
                case 1:
                    return "Przelew";
                case 2:
                    return "Gotówka";
                case 3:
                    return "Barter";
                default:
                    return string.Empty;
            }
        }

        public static bool AddInvoice(REKLAMADataSet reklamaDataSet, FAKTURYTableAdapter fakturaAdapter, FAKTURA_DETAILSTableAdapter fakturaDetailsAdapter, WplatyTableAdapter wplataAdapter, REKLAMADataSet.FAKTURYRow fakturaRow)
        {
            SqlConnection conn;
            SqlTransaction transaction = null;
            try
            {
                conn = new SqlConnection(ConnString.getConnString().Value);
                fakturaAdapter.Connection = conn;
                fakturaDetailsAdapter.Connection = conn;
                wplataAdapter.Connection = conn;

                conn.Open();

                transaction = conn.BeginTransaction();
                fakturaAdapter.AttachTransaction(transaction);
                fakturaDetailsAdapter.AttachTransaction(transaction);
                wplataAdapter.AttachTransaction(transaction);

                fakturaAdapter.Update(reklamaDataSet.FAKTURY);
                fakturaDetailsAdapter.Update(reklamaDataSet.FAKTURA_DETAILS);
                wplataAdapter.Update(reklamaDataSet.Wplaty);
                transaction.Commit();
            }
            catch (Exception)
            {
                if (transaction != null) transaction.Rollback();
                reklamaDataSet.FAKTURY.RemoveFAKTURYRow(fakturaRow);
                throw;
            }
            return true;
        }

        public static void AddInvoiceDetails(REKLAMADataSet.FAKTURYRow newInvoice, REKLAMADataSet.FAKTURYRow clientInvoice, REKLAMADataSet.FAKTURA_DETAILSRow detailsRow, REKLAMADataSet.FAKTURA_DETAILSDataTable detailsTable)
        {
            REKLAMADataSet.FAKTURA_DETAILSRow row = detailsTable.NewFAKTURA_DETAILSRow();

            row.ROK = detailsRow.ROK;
            row.MIESIAC = detailsRow.MIESIAC;
            row.TYTUL = detailsRow.TYTUL;
            row.NAZWA_USLUGI = clientInvoice != null ? clientInvoice.NUMER + "/" + clientInvoice.NUMER_ROZ + "/" + clientInvoice.NUMER_ROK + " | " + detailsRow.NAZWA_USLUGI : "";
            row.reklamaId = detailsRow.reklamaId;
            row.NR_WYDANIA = detailsRow.NR_WYDANIA;

            row.CENA_JEDN = detailsRow.CENA_JEDN;
            row.ILOSC = 1;
            row.JM = "szt.";

            row.UPUST_NETTO = detailsRow.UPUST_NETTO;
            row.UPUST_PR = detailsRow.UPUST_PR;
            row.NETTO = detailsRow.NETTO;
            row.S_VAT = VatHelper.PL22;
            row.VAT = (decimal)VatHelper.PL22 * detailsRow.NETTO;
            row.BRUTTO = detailsRow.NETTO * (decimal)(1 + VatHelper.PL22);

            row.TYP = 2;
            row.PODTYP = 1;
            row.ID_FAKTURY = newInvoice.ID_FAKTURY;

            row.wyroznienie = (!detailsRow.IswyroznienieNull() && detailsRow.wyroznienie);

            detailsTable.AddFAKTURA_DETAILSRow(row);
        }

        public static string GetNazwaUslugiPozKat(REKLAMADataSet.FAKTURYRow faktura, REKLAMADataSet.FAKTURA_DETAILSRow pozycjaFaktury)
        {
            if (faktura == null) return string.Empty;

            return faktura.NUMER + "/" + faktura.NUMER_ROZ + "/" + faktura.NUMER_ROK + " | " + pozycjaFaktury.NAZWA_USLUGI;
        }

        public static REKLAMADataSet.FAKTURYRow GetInvoice(DataTable fakturyTable,
                                                              REKLAMADataSet.KLIENCIRow klientAgencja,
                                                              SLOWNIKDataSet.AGENCJERow agencja,
                                                              SLOWNIKDataSet.AGENCJERow redakcja,
                                                              SLOWNIKDataSet.KONTARow bankAccount,
                                                              string numer_roz,
                                                              PaymentType paymentType,
                                                              DateTime dateTime)
        {
            REKLAMADataSet.FAKTURYRow naglowekFaktury = (REKLAMADataSet.FAKTURYRow)fakturyTable.NewRow();

            naglowekFaktury.NUMER_ROZ = numer_roz;
            naglowekFaktury.NUMER = Utils.numerNowejFaktury(naglowekFaktury.NUMER_ROZ, DateTime.Today.Year);
            naglowekFaktury.NUMER_ROK = DateTime.Today.Year;

            naglowekFaktury.DATA_WYSTAWIENIA = dateTime != DateTime.Today ? dateTime : DateTime.Today;

            naglowekFaktury.idZamowienia = agencja.Id_agencji == (int)OfficeId.Poznan ?
                                           (int)OrderId.Poznan : (int)OrderId.Katowice;

            naglowekFaktury.ID_SPRZEDAWCY = agencja.Id_agencji;

            naglowekFaktury.EKSPORT = false;

            naglowekFaktury.MIEJSCOWOSC_WYSTAWIENIA = redakcja.miasto;
            naglowekFaktury.SPRZEDAWCA_ADRES = redakcja.Adres_Fk;
            naglowekFaktury.SPRZEDAWCA_NIP = redakcja.NIP;

            naglowekFaktury.PODPIS_WYSTAWIL = string.Empty;
            naglowekFaktury.DATA_SPRZEDAZY = naglowekFaktury.DATA_WYSTAWIENIA;

            naglowekFaktury.ID_NABYWCY = klientAgencja.CustomerID;
            naglowekFaktury.NABYWCA_ADRES = klientAgencja.Adres_Fkatura;
            naglowekFaktury.NABYWCA_NIP = klientAgencja.Nip;
            naglowekFaktury.opis = string.Empty;

            naglowekFaktury.SPOSOB_ZAPLATY = GetPaymentType((int)paymentType);

            naglowekFaktury.TERMIN_ZAPLATY = naglowekFaktury.DATA_SPRZEDAZY.AddDays(14);
            naglowekFaktury.ZAPLACONO = false;

            naglowekFaktury.FAKTURA_TYP = 2;
            naglowekFaktury.FAKTURA_PODTYP = 1;

            naglowekFaktury.ID_KONTA = Convert.ToInt16(bankAccount.id);

            naglowekFaktury.EndEdit();
            return naglowekFaktury;
        }
    }
}