using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;

namespace Elwig.Models {
    [Table("payment_variant"), PrimaryKey("Year", "AvNr")]
    public class PaymentVar {
        [Column("year")]
        public int Year { get; set; }

        [Column("avnr")]
        public int AvNr { get; set; }

        [Column("name")]
        public string Name { get; set; }

        [Column("date")]
        public string DateString { get; set; }

        [NotMapped]
        public DateOnly Date {
            get => DateOnly.ParseExact(DateString, "yyyy-MM-dd");
            set => DateString = value.ToString("yyyy-MM-dd");
        }

        [Column("transfer_date")]
        public string? TransferDateString { get; set; }

        [NotMapped]
        public DateOnly? TransferDate {
            get => TransferDateString != null ? DateOnly.ParseExact(TransferDateString, "yyyy-MM-dd") : null;
            set => TransferDateString = value?.ToString("yyyy-MM-dd");
        }

        [Column("test_variant")]
        public bool TestVariant { get; set; }

        [Column("calc_time")]
        public int? CalcTime { get; set; }

        [Column("bucket_1_name")]
        public string? Bucket1Name { get; set; }

        [Column("bucket_2_name")]
        public string? Bucket2Name { get; set; }

        [Column("bucket_3_name")]
        public string? Bucket3Name { get; set; }

        [Column("bucket_4_name")]
        public string? Bucket4Name { get; set; }

        [Column("bucket_5_name")]
        public string? Bucket5Name { get; set; }

        [Column("bucket_6_name")]
        public string? Bucket6Name { get; set; }

        [Column("bucket_7_name")]
        public string? Bucket7Name { get; set; }

        [Column("bucket_8_name")]
        public string? Bucket8Name { get; set; }

        [Column("bucket_9_name")]
        public string? Bucket9Name { get; set; }

        [NotMapped]
        public string[] BucketNames => (new string?[] { Bucket1Name, Bucket2Name, Bucket3Name, Bucket4Name, Bucket5Name, Bucket6Name, Bucket7Name, Bucket8Name, Bucket9Name })
			.Where(n => n != null).Select(n => n ?? "").ToArray();

        [Column("comment")]
        public string? Comment { get; set; }

        [Column("data")]
        public string Data { get; set; }

        [ForeignKey("Year")]
        public virtual Season Season { get; private set; }

        [InverseProperty("Variant")]
        public virtual ISet<PaymentMember> MemberPayments { get; private set; }

        [InverseProperty("Variant")]
        public virtual ISet<Credit> Credits { get; private set; }
    }
}