using FakturyWeb.Business;
using FakturyWeb.Data;
using Microsoft.VisualBasic.CompilerServices;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace RazorPagesMovie.Models
{
  public class FAKTURA
  {
    public int ID { get; set; }

    [Required]
    [DisplayName("Zákazník")]
    [Range(1, Int32.MaxValue, ErrorMessage = "Vyberte zákazníka ze seznamu")]
    public int ZakaznikID { get; set; }

    public ZAKAZNIK ZAKAZNIK { get; set; }

    public ICollection<POLOZKA> POLOZKY { get; set; }

    public ICollection<PLATBA> PLATBY { get; set; }

    [DisplayName("Číslo")]
    public string CISLO { get; set; }

    public int CISLO_ABS { get; set; }

    [DataType(DataType.Date)]
    [DisplayName("Datum vystavení")]
    public DateTime VYSTAVENI { get; set; }

    [DataType(DataType.Date)]
    [DisplayName("Datum splatnosti")]
    public DateTime SPLATNOST { get; set; }

    [DisplayName("Dodavatel")]
    public string D_PRAJM { get; set; }

    [DisplayName("Ulice")]
    public string D_ULICE { get; set; }

    [DisplayName("Město")]
    public string D_MESTO { get; set; }

    [DisplayName("PSČ")]
    public string D_PSC { get; set; }

    [DisplayName("IČ")]
    public string D_IC { get; set; }

    [DisplayName("DIČ")]
    public string D_DIC { get; set; }

    [DisplayName("Bankovní účet")]
    public string D_BANKA { get; set; }

    [DisplayName("Telefon")]
    public string D_TELEFON { get; set; }

    [DisplayName("E-mail")]
    public string D_EMAIL { get; set; }

    [DisplayName("Web")]
    public string D_WEB { get; set; }

    [DisplayName("Odběratel")]
    public string O_PRAJM { get; set; }

    [DisplayName("Ulice")]
    public string O_ULICE { get; set; }

    [DisplayName("Město")]
    public string O_MESTO { get; set; }

    [DisplayName("PSČ")]
    public string O_PSC { get; set; }

    [DisplayName("IČ")]
    public string O_IC { get; set; }

    [DisplayName("DIČ")]
    public string O_DIC { get; set; }

    [DisplayName("Forma úhrady")]
    public byte FORMA_UHRADY { get; set; }

    [DisplayName("Popis činností")]
    public string CINNOSTI { get; set; }


    public FAKTURA()
    {
      VYSTAVENI = DateTime.Today;
      SPLATNOST = VYSTAVENI.Date.AddDays(15);
      FORMA_UHRADY = 1;
    }

    public void Init(FakturyWebContext context)
    {
      SetCisloFaktury(context);
    }

    private void SetCisloFaktury(FakturyWebContext context)
    {
      if (!context.UZIVATEL.Any())
      {
        return;
      }

      // get nastavení:
      UZIVATEL myUzivatel = context.UZIVATEL.First();

      D_PRAJM = myUzivatel.PRAJM;
      D_ULICE = myUzivatel.ULICE;
      D_PSC = myUzivatel.PSC;
      D_MESTO = myUzivatel.MESTO;
      D_IC = myUzivatel.IC;
      D_DIC = myUzivatel.DIC;
      D_TELEFON = myUzivatel.TELEFON;
      D_EMAIL = myUzivatel.EMAIL;
      D_BANKA = myUzivatel.BANKA;
      D_WEB = myUzivatel.WEB;

      //číslo faktury:
      int poslCislo = 0;
      if (myUzivatel.FAKTURA_CISLOVANI == 1) // po roce...
      {
        poslCislo = (from f in context.FAKTURA
                     where f.VYSTAVENI.Year == VYSTAVENI.Year
                     orderby f.CISLO_ABS descending
                     select f.CISLO_ABS).FirstOrDefault();
        CISLO_ABS = poslCislo + 1;
      }
      else // po měsíci...
      {
        poslCislo = (from f in context.FAKTURA
                     where f.VYSTAVENI.Year == this.VYSTAVENI.Year & f.VYSTAVENI.Month == this.VYSTAVENI.Month
                     orderby f.CISLO_ABS descending
                     select f.CISLO_ABS).FirstOrDefault();
        CISLO_ABS = poslCislo + 1;
      }
      // formát čísla:
      string myCislo = "";
      try
      {
        var myParser = new ParserFakturaCislo(myUzivatel.FAKTURA_MASKA);
        myParser.Parse();
        foreach (var symb in myParser.logic)
        {
          switch (symb.GetTyp)
          {
            case var @case when Operators.ConditionalCompareObjectEqual(@case, SymbolEnum.CISLO2, false):
              {
                myCislo +=  CISLO_ABS.ToString("00");
                break;
              }
            case var case1 when Operators.ConditionalCompareObjectEqual(case1, SymbolEnum.CISLO4, false):
              {
                myCislo +=  CISLO_ABS.ToString("0000");
                break;
              }
            case var case2 when Operators.ConditionalCompareObjectEqual(case2, SymbolEnum.CISLO6, false):
              {
                myCislo +=  CISLO_ABS.ToString("000000");
                break;
              }
            case var case3 when Operators.ConditionalCompareObjectEqual(case3, SymbolEnum.ROK, false):
              {
                myCislo += VYSTAVENI.ToString("yyyy");
                break;
              }
            case var case4 when Operators.ConditionalCompareObjectEqual(case4, SymbolEnum.MESIC, false):
              {
                myCislo += VYSTAVENI.ToString("MM");
                break;
              }
            case var case5 when Operators.ConditionalCompareObjectEqual(case5, SymbolEnum.TEXT, false):
              {
                myCislo += symb.ToString();
                break;
              }
          }
        }
      }
      catch (Exception ex)
      {
        myCislo = "0";
      }

      if (myCislo.Length > 20)
      {
        //VystrazneHlaseni("Číslo faktury může mít maximálně 20 znaků. Číslo faktury bude oříznuto.");
        //myCislo = Strings.Left(myCislo, 20);
      }
      CISLO = myCislo;
    }

  }
}