using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using bdHerramientaCACOA.db;
using bdHerramientaCACOA.extensiones;
using static bdHerramientaCACOA.CASA;

namespace bdHerramientaCACOA.HerramientaURBAN
{
    public partial class URBAN
    {
        public class URBANTrabajoProfesional
        {
            public int idTipoDocumentacion { get; set; } = 0;
            public int idTipoProyecto { get; set; } = 0;
            

            public int idInstrumento { get; set; } = 0;
            public double valorInstrumentos { get; set; } = 0;

            public double horasTrabProfesional { get; set; } = 0;
            public double horasTrabProfesionalEstimacion { get; set; } = 0;

            public bool EsPorUsos { get; set; } = true;

            public List<DocumentacionURBAN> DocumentacionMinima { get; set; } = new List<DocumentacionURBAN>();

            public List<DocumentacionURBAN> DocumentacionOpcional { get; set; } = new List<DocumentacionURBAN>();

            public List<DocumentacionURBAN> DatosNecesarios { get; set; } = new List<DocumentacionURBAN>();

            public List<FasesURBAN> FasesTrabajoProfesional { get; set; } = new List<FasesURBAN>();

        }
        public void ActualizarFase(FasesURBAN ft)
        {
            int indice = TrabajoProfesional.FasesTrabajoProfesional.ToList().IndexOf(ft);
            TrabajoProfesional.FasesTrabajoProfesional[indice] = ft;
            CalcularHorasTrabajoProfesional();
        }
        public void ActualizarDocumentacionOpcional(DocumentacionURBAN doc)
        {
            int indice = TrabajoProfesional.DocumentacionOpcional.ToList().IndexOf(doc);
            TrabajoProfesional.DocumentacionOpcional[indice] = doc;
            CalcularHorasTrabajoProfesional();
        }
        public void ActualizarDatoNecesario(DocumentacionURBAN doc) {
            int indice = TrabajoProfesional.DatosNecesarios.ToList().IndexOf(doc);
            TrabajoProfesional.DatosNecesarios[indice] = doc;
            CalcularHorasTrabajoProfesional();
        }
        public void CalcularHorasTrabajoProfesional() {
            double valorhoras = ObtenerHoraTipoDocumento();
            double totalEncargo = TrabajoProfesional.FasesTrabajoProfesional.Sum(x => x.Porcentaje);
            double porcentajeInnovacion = TrabajoProfesional.valorInstrumentos;

            TrabajoProfesional.horasTrabProfesional = (valorhoras * (totalEncargo / 100) * (porcentajeInnovacion / 100)).DosDecimales();
            TrabajoProfesional.horasTrabProfesionalEstimacion = TrabajoProfesional.horasTrabProfesional;
            CalcularCostesProduccion();
        }

        public double ObtenerHoraTipoDocumento()
        {
            int datos = TrabajoProfesional.DatosNecesarios.Count;
            var colcoef = "?";
            var formHP = "?";
            double TPCOEF1 = obtenerTPCOEF1();
            double TPCOEF2 = 0;
            if (TrabajoProfesional.DatosNecesarios.Count >= 2) {
                if (TrabajoProfesional.DatosNecesarios[1].esCheckbox)
                {
                    if (TrabajoProfesional.DatosNecesarios[1].Checkeada)
                    {
                        TPCOEF2 = TrabajoProfesional.DatosNecesarios[1].CoefHoras;
                    }
                }
                else {
                    double TPdato2 = TrabajoProfesional.DatosNecesarios[1].ValorNecesario;
                    TPCOEF2 = TrabajoProfesional.DatosNecesarios[1].CoefHoras * TPdato2;
                }
            }
            double TPCOEF3 = 0;
            if (TrabajoProfesional.DatosNecesarios.Count >= 3)
            {
                if (TrabajoProfesional.DatosNecesarios[2].Checkeada) {
                    TPCOEF3 = TrabajoProfesional.DatosNecesarios[2].CoefHoras;
                }

            }


            return ((TPCOEF1+TPCOEF2)*(1+TPCOEF3)).DosDecimales();
        }

        public double obtenerTPCOEF1()
        {
            if(TrabajoProfesional.idTipoProyecto != 0)
            {
                int minimo = TrabajoProfesional.DocumentacionMinima.Count;
                int opciones = TrabajoProfesional.DocumentacionOpcional.Count;
                int opcSel = TrabajoProfesional.DocumentacionOpcional.Where(x => x.Checkeada == true).Count();
                string abreviatura = Enumerados.TiposProyecto.First(x => x.idtipoproyectos == TrabajoProfesional.idTipoProyecto).Abreviatura;
                double TPdato1 = TrabajoProfesional.DatosNecesarios[0].ValorNecesario;
                double formDato1 = 0;
                if (TPdato1 != 0)
                {
                    switch (abreviatura)
                    {
                        case "PGOM":
                            if (TPdato1 < 1)
                            {
                                formDato1 = 0.7 * 77.14;
                            }
                            else
                            {
                                formDato1 = 0.7 * (95.413 * Math.Pow(TPdato1, -0.328));
                            }
                            break;
                        case "POI":
                            if (TPdato1 > 50)
                            {
                                formDato1 = 70.6;
                            }
                            else
                            {
                                formDato1 = 56.703 * Math.Pow(TPdato1, 0.0554);
                            }
                            break;
                        case "PBOM":
                            if (TPdato1 < 1)
                            {
                                formDato1 = 0.7 * 77.14;
                            }
                            else
                            {
                                formDato1 = (95.413 * Math.Pow(TPdato1, -0.328));
                            }
                            break;
                        case "POU":
                            if (TPdato1 < 1)
                            {
                                formDato1 = 0.3 * 77.14;
                            }
                            else
                            {
                                formDato1 = 0.3 * (95.413 * Math.Pow(TPdato1, -0.328));
                            }
                            break;
                        case "PPO":
                            if (TPdato1 <= 5)
                            {
                                formDato1 = 9.44;
                            }
                            else
                            {
                                if (TPdato1 > 100)
                                {
                                    formDato1 = 2.3;
                                }
                                else
                                {
                                    formDato1 = 24.911 * Math.Pow(TPdato1, -0.473);
                                }
                            }
                            break;
                        case "PRI":
                            if (TPdato1 <= 5)
                            {
                                formDato1 = 17.08;
                            }
                            else
                            {
                                if (TPdato1 > 100)
                                {
                                    formDato1 = 3.67;
                                }
                                else
                                {
                                    formDato1 = 50.413 * Math.Pow(TPdato1, -0.524);
                                }
                            }
                            break;
                        case "EO":
                            if (TPdato1 <= 5)
                            {
                                formDato1 = 12.2;
                            }
                            else
                            {
                                if (TPdato1 > 100)
                                {
                                    formDato1 = 3.17;
                                }
                                else
                                {
                                    formDato1 = 31.953 * Math.Pow(TPdato1, -0.475);
                                }
                            }
                            break;
                        case "PE":
                            if (TPdato1 <= 5)
                            {
                                formDato1 = 6.8;
                            }
                            else
                            {
                                if (TPdato1 > 100)
                                {
                                    formDato1 = 1.81;
                                }
                                else
                                {
                                    formDato1 = 17.536 * Math.Pow(TPdato1, -0.468);
                                }
                            }
                            break;
                        case "PEP":
                            if (TPdato1 <= 5)
                            {
                                formDato1 = 22.65;
                            }
                            else
                            {
                                if (TPdato1 > 100)
                                {
                                    formDato1 = 6;
                                }
                                else
                                {
                                    formDato1 = 58.555 * Math.Pow(TPdato1, -0.468);
                                }
                            }
                            break;
                        case "ED":
                            if (TPdato1 < 10)
                            {
                                formDato1 = 10.085 * Math.Pow(TPdato1, -0.4);
                            }
                            else
                            {
                                formDato1 = 4.2;
                            }
                            break;
                        case "CAT":
                            formDato1 = TrabajoProfesional.DatosNecesarios.First().CoefHoras;
                            break;
                        case "PPAR":
                            if (TPdato1 > 50)
                            {
                                formDato1 = 0.88;
                            }
                            else
                            {
                                formDato1 = 4.7193 * Math.Pow(TPdato1, -0.34);
                            }
                            break;
                        case "UE":
                            if (TPdato1 >= 100)
                            {
                                formDato1 = 0.26;
                            }
                            else
                            {
                                formDato1 = 2.1598 * Math.Pow(TPdato1, -0.468);
                            }
                            break;
                        case "PREP":
                            if (TPdato1 >= 100)
                            {
                                formDato1 = 0.94;
                            }
                            else
                            {
                                formDato1 = 4.9615 * Math.Pow(TPdato1, -0.328);
                            }
                            break;
                        case "PNF":
                            if (TPdato1 >= 100)
                            {
                                formDato1 = 0.94;
                            }
                            else
                            {
                                formDato1 = 4.9615 * Math.Pow(TPdato1, -0.328);
                            }
                            break;
                        case "PDCU":
                            if (TPdato1 >= 100)
                            {
                                formDato1 = 0.94;
                            }
                            else
                            {
                                formDato1 = 4.9615 * Math.Pow(TPdato1, -0.328);
                            }
                            break;
                        case "PETC":
                            if (TPdato1 >= 100)
                            {
                                formDato1 = 1.85;
                            }
                            else
                            {
                                formDato1 = 8.97 * Math.Pow(TPdato1, -0.322);
                            }
                            break;
                        case "PU":
                            if (TPdato1 >= 100)
                            {
                                formDato1 = 50;
                            }
                            else
                            {
                                formDato1 = -27.14 * Math.Log(TPdato1) + 189.88;
                            }
                            break;
                        case "POOU":
                            if (TPdato1 >= 100)
                            {
                                formDato1 = 50;
                            }
                            else
                            {
                                formDato1 = -27.14 * Math.Log(TPdato1) + 189.88;
                            }
                            break;
                        case "PDATU":
                            if (TPdato1 <= 100)
                            {
                                formDato1 = 1.65;
                            }
                            else
                            {
                                formDato1 = 25.451 * Math.Pow(TPdato1, -0.328);
                            }
                            break;
                        case "PEAAT":
                            if (TPdato1 <= 1)
                            {
                                formDato1 = 10.14;
                            }
                            else
                            {
                                formDato1 = 13.898 * Math.Pow(TPdato1, -0.383);
                            }
                            break;
                        case "PA":
                            if (TPdato1 <= 1)
                            {
                                formDato1 = 10.14;
                            }
                            else
                            {
                                formDato1 = 13.898 * Math.Pow(TPdato1, -0.383);
                            }
                            break;
                    }
                }
                double TPdatoXformula = (TPdato1 * formDato1).DosDecimales();
                return ((minimo + (0.5 * opcSel)) * TPdatoXformula).DosDecimales();
            }
            else
            {
                return 0;
            }
           
        }
        public class FasesURBAN
        {
            public int idFase { get; set; } = 0;
            public string Codigo { get; set; } = "";
            public string Denominacion { get; set; } = "";
            public double Porcentaje { get; set; } = 0;
        }

        
    }
}
