export module Grain {
    export type SimulationCommunaute = {
        puissance: number
        economies?: number
        autoconso: number
        autoprod: number
        frais_divers: number
        prix: number
        apport: number
        interet: number
        echeances: number
        conso_moyenne_foyer: number
        productible: number
        degradation: number
        inflation: number
        ratio: number
        enedis: number
        tarif_cre: {
            limites: number[]
            prix: number[]
            inflation: number
        }
        cout_elec: number
        inflation_elec: number
        maintenance: number
        turpe: number
        turpe_injection: number
        provision_onduleurs: number
        assurance: number
        divers: number
        ratio_dc_ac: number
        duree_amortissement: number
        taux_is: number
        taux_dsra: number
    }

    export function newSimulationCommunaute(): SimulationCommunaute {
        return {
            puissance: 0,
            autoconso: 90,
            autoprod: 10,
            frais_divers: 1000,
            prix: 0.13,
            apport: 10000,
            interet: 4.5,
            echeances: 96,
            conso_moyenne_foyer: 2500, //Kwh/an
            productible: 1100,
            degradation: 0.6,
            inflation: 1,
            ratio: 1.1, // €/Wc
            enedis: 1500,
            tarif_cre: {
                limites: [0, 9, 100],
                prix: [0.1301, 0.781, 0.1141],
                inflation: 1,
            },
            cout_elec: 0.24, // €
            inflation_elec: 3, // %
            maintenance: 7, // €/kWc
            turpe: 16, // €/kWc
            turpe_injection: 0.0278,
            provision_onduleurs: 0.1, // €/Wc
            assurance: 1, // % des travaux estimé entre 0.5% et 0.8%
            divers: 12,
            ratio_dc_ac: 0.8,
            duree_amortissement: 10, // durée fiscale en années
            taux_is: 25,
            taux_dsra: 1.7, // %
        }
    }

    export type SaveFunction = (e: Event, nom: string, simulation: SimulationCommunaute, prms: Prm[], profils: Profil[], communaute?: Communaute) => Promise<void>

    export type Rapport = {
        id: string,
        nom: string,
        simulation: SimulationCommunaute,
        communaute?: Communaute,
        production?: number[]
        charge?: Record<string, number[]>
            interets_annuel: number[],
            remboursement_annuel: number[],
    };

    export type RapportFunction = (r: Rapport) => Promise<void>

    export type ListProjets = { ListProjets: null }
    export type ListProjetsResp = {
        id: string
        nom: string
        puissance: number
        t: number
    }[]

    export type CreateProjet = {
        CreateProjet: {
            nom?: string
            porteur?: string
            tel?: string
            adresse?: string
            centrales: Centrale[]
            simulation?: SimulationCommunaute
            prms: Prm[]
        }
    }

    export type Centrale = {
        position?: { lat: number; lng: number }
        azimuth?: number
        inclinaison?: number
    }

    export type CreateProjetResp = null | string

    export type SaveProjet = {
        SaveProjet: {
            id: string
            nom?: string
            porteur?: string
            tel?: string
            adresse?: string
            communaute?: Communaute,
            simulation?: SimulationCommunaute
            prms: Prm[]
            profils: Profil[]
            centrales: Centrale[]
        }
    }

    export type Prm = {
        prm: number | null
        nom: string
        prenom: string
        siret?: string
        serie?: string
        codeinsee?: string
        numerorue?: string
        pro?: boolean
        releve?: string
        consentement?: boolean
    }

    export type Profil = {
        type: string; conso: number
    }



    export type GetProjet = { GetProjet: string }
    export type GetProjetResp = null | {
        id: string
        nom?: string
        porteur?: string
        tel?: string
        adresse?: string
        communaute?: Communaute,
        simulation?: SimulationCommunaute
        img?: string
        prms: Prm[]
        profils: Profil[]
        expert: boolean,
    }

    export type DelProjet = {
        DelProjet: {
            id: string
        }
    }

    export type Cmd =
        | ListProjets
        | CreateProjet
        | SaveProjet
        | DelProjet
        | GetProjet

    export type LatLng = { lat: number; lng: number }
    export type Derogation = 'non' | '10' | '20'
    export type Compteur = {
        lat: number
        lng: number
        puissance: number
        azimuth: number
        inclinaison: number
    }
    export type Communaute = {
        lat: number
        lng: number
        derogation: Derogation
        compteurs?: Compteur[]
    }

  export function profils(expert: boolean) {
    let profils_: Record<string, { profils: string[] }> = {
        'Résidentiel ≤6kVA': {
          profils: ['RES1-P1'],
        },

        'Résidentiel 6>kVA≤36': {
          profils: ['RES11-P1'],
        },

        'Résidentiel ≤36kVA HPHC': {
          profils: ['RES2'],
        },

        'Professionel ≤36kVA': {
          profils: ['PRO1-P1'],
        },

        'Professionnel ≤36kVA HWE': {
          profils: ['PRO1WE'],
        },

        'Professionnel ≤36kVA HPHC': {
          profils: ['PRO2'],
        },

        'Entreprise 36<kVA<250 HPHC ETE-HIV': {
          profils: ['ENT1'],
        },

        /*
           "Production hydraulique":{
           "profils":[ "PRD1-P1" ]
           },

           "Production cogénération":{
           "profils":[ "PRD2-P1" ]
           },

           "Production photovoltaïque":{
           "profils":[ "PRD3-P1" ]
           },
         */
      }
      if(expert) {

      for (let p of [
        "ENT1-P1",
        "ENT1-P2",
        "ENT1-P3",
        "ENT1-P4",
        "ENT2-P1",
        "ENT2-P2",
        "ENT2-P3",
        "ENT2-P4",
        "ENT3-P1",
        "ENT3-P2",
        "ENT3-P3",
        "ENT3-P4",
        "ENT3-P5",
        "ENT4-P1",
        "ENT4-P2",
        "ENT4-P3",
        "ENT4-P4",
        "ENT5-P1",
        "ENT5-P2",
        "ENT5-P3",
        "ENT5-P4",
        "ENT5-P5",
        "ENT5-P6",
        "ENT5-P7",
        "ENT5-P8",
        "ENT6-P1",
        "ENT6-P2",
        "ENT6-P3",
        "ENT6-P4",
        "ENT6-P5",
        "ENT6-P6",
        "ENT7-P1",
        "ENT7-P2",
        "ENT7-P3",
        "ENT7-P4",
        "ENT7-P5",
        "PRD1-P1",
        "PRD2-P1",
        "PRD3-P1",
        "PRD4-P1",
        "PRO1-P1",
        "PRO1WE-P1",
        "PRO1WE-P2",
        "PRO22WE-P1",
        "PRO22WE-P2",
        "PRO22WE-P3",
        "PRO22WE-P4",
        "PRO2-P1",
        "PRO2-P2",
        "PRO3-P1",
        "PRO3-P2",
        "PRO3-P3",
        "PRO3-P4",
        "PRO3-P5",
        "PRO3-P6",
        "PRO4-P1",
        "PRO4-P2",
        "PRO5-P1",
        "PRO6-P1",
        "PRO6-P2",
        "PRO6-P3",
        "PRO6-P4",
        "RES11-P1",
        "RES11WE-P1",
        "RES11WE-P2",
        "RES1-P1",
        "RES1WE-P1",
        "RES1WE-P2",
        "RES22WE-P1",
        "RES22WE-P2",
        "RES22WE-P3",
        "RES22WE-P4",
        "RES2-P1",
        "RES2-P2",
        "RES2WE-P1",
        "RES2WE-P2",
        "RES2WE-P3",
        "RES3-P1",
        "RES3-P2",
        "RES3-P3",
        "RES3-P4",
        "RES3-P5",
        "RES3-P6",
        "RES4-P1",
        "RES4-P2",
        "RES5-P1",
        "RES5-P2",
        "RES5-P3",
        "RES5-P4",
      ]) {
        profils_[p] = {
          profils: [p]
        }
      }
    }
    return profils_;
  }
}