using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using bdHerramientaCACOA.extensiones;
using static bdHerramientaCACOA.CASA;
namespace bdHerramientaCACOA.HerramientaURBAN
{
    public partial class URBAN
    {
        public class URBANCostesProduccion
        {
            public bool EsCalculado { get; set; } = true;
            public double porcentaje { get; set; } = 2.5;
            public List<CosteVariable> ListaCostesVariables { get; set; } = new List<CosteVariable>();
            public double CostesVariables { get; set; } = 0;
            public double TotalCostesVariables { get; set; } = 0;
            public double TotalCostes { get; set; } = 0;
            public double CoeficienteCostesExternalizacion { get; set; } = 15;
            public double CosteHoraExternalizacion { get; set; } = 0;


            //h
            public double HorasTrabajoProfesional { get; set; } = 0;
            public double PlazoPresentacionDocumentos { get; set; } = 6;
            public double HorasEnPlazo { get; set; } = 0;
            public double NumHorasMinimoExt { get; set; } = 0;

            //€
            public double CostesProduccionTrabProf { get; set; } = 0;
            public double Beneficio { get; set; } = 0;
            public double PrecioTrabajoProfesional { get; set; } = 0;
        }

        //Funciones Costes Produccion
        public void InsertarCostesVariables(CosteVariable cv)
        {
            CostesProduccion.ListaCostesVariables.Add(cv);
            CalcularCostesProduccion();
        }
        public void ActualizarCostesVariables(CosteVariable cv)
        {
            int indice = CostesProduccion.ListaCostesVariables.ToList().IndexOf(cv);
            CostesProduccion.ListaCostesVariables[indice] = cv;

            CalcularCostesProduccion();
        }
        public void EliminarCostesVariables(CosteVariable cv)
        {
            CostesProduccion.ListaCostesVariables.Remove(cv);
            CalcularCostesProduccion();
        }
        public double CalcularCostesTotales()
        {
            return CostesProduccion.ListaCostesVariables.Sum(x => x.Coste);
        }
        public void CalcularCostesProduccion()
        {

            if (CostesProduccion.EsCalculado)
            {
                double chtp = CalcularHorasTotalesProduccion();
                if (chtp == 0)
                {
                    CostesProduccion.CostesVariables = 0;
                }
                else
                {
                    CostesProduccion.CostesVariables = Math.Round(CalcularCostesTotales() / CalcularHorasTotalesProduccion(), 2);
                }
            }
            else
            {
                CostesProduccion.CostesVariables = ((DespachoProfesional.CostesDirectos + DespachoProfesional.TasaCostesIndirectos) * (CostesProduccion.porcentaje / 100)).DosDecimales();
            }
            CostesProduccion.TotalCostesVariables = CalcularCostesTotales();
            CostesProduccion.TotalCostes = (DespachoProfesional.CostesDirectos + DespachoProfesional.TasaCostesIndirectos + CostesProduccion.CostesVariables).DosDecimales();
            CostesProduccion.CosteHoraExternalizacion = Math.Round(CostesProduccion.TotalCostes * (1 + CostesProduccion.CoeficienteCostesExternalizacion / 100), 2, MidpointRounding.AwayFromZero);
            
            
            //H
            if (TrabajoProfesional.horasTrabProfesional<40) {
                CostesProduccion.HorasTrabajoProfesional = 40;
            }
            else
            {
                double totalEncargo = TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje);
                CostesProduccion.HorasTrabajoProfesional = (TrabajoProfesional.horasTrabProfesional * (totalEncargo / 100)).DosDecimales();
            }
            /*
            CostesProduccion.HorasEnPlazo = (DespachoProfesional.HorasTotalesProduccion * CostesProduccion.PlazoPresentacionDocumentos / 12).DosDecimales();
            if (CostesProduccion.HorasEnPlazo >= CostesProduccion.HorasTrabajoProfesional)
            {
                CostesProduccion.NumHorasMinimoExt = 0;
            }
            else
            {
                CostesProduccion.NumHorasMinimoExt = (CostesProduccion.HorasTrabajoProfesional - CostesProduccion.HorasEnPlazo).DosDecimales();
            }*/

            CostesProduccion.HorasEnPlazo = (DespachoProfesional.HorasTotalesProduccion * CostesProduccion.PlazoPresentacionDocumentos / 12).DosDecimales();
            if (CostesProduccion.HorasEnPlazo > TrabajoProfesional.horasTrabProfesional) {
                CostesProduccion.HorasEnPlazo = TrabajoProfesional.horasTrabProfesional;
            }
            CostesProduccion.NumHorasMinimoExt = (CostesProduccion.HorasEnPlazo >= TrabajoProfesional.horasTrabProfesional) ?
            0 :
            Math.Round(TrabajoProfesional.horasTrabProfesional - CostesProduccion.HorasEnPlazo, 2, MidpointRounding.AwayFromZero);

            //€
            if (CostesProduccion.NumHorasMinimoExt == 0)
            {
                CostesProduccion.CostesProduccionTrabProf = (CostesProduccion.HorasTrabajoProfesional * CostesProduccion.TotalCostes).DosDecimales();
            }
            else
            {
              CostesProduccion.CostesProduccionTrabProf = ((CostesProduccion.HorasEnPlazo * CostesProduccion.TotalCostes) + (CostesProduccion.NumHorasMinimoExt * CostesProduccion.CosteHoraExternalizacion)).DosDecimales();
            }
            CostesProduccion.PrecioTrabajoProfesional = (CostesProduccion.CostesProduccionTrabProf * (1+(CostesProduccion.Beneficio/100))).DosDecimales();
        }
    }
}
