module Common.Message.Translation
  ( get
  ) where

import           Data.Text           (Text)
import qualified Data.Text           as T

import           Common.Message.Key
import           Common.Message.Lang (Lang (..))

get :: Lang -> Key -> Text
get = m

m :: Lang -> Key -> Text

m l App_Title =
  case l of
    English -> "Shared Cost"
    French  -> "Partage des frais"

m l Category_Add =
  case l of
    English -> "Add an category"
    French  -> "Ajouter une catégorie"

m l Category_Clone =
  case l of
    English -> "Clone an category"
    French  -> "Cloner une catégorie"

m l Category_Color =
  case l of
    English -> "Color"
    French  -> "Couleur"

m l Category_DeleteConfirm =
  case l of
    English -> "Are you sure to delete this category ?"
    French  -> "Voulez-vous vraiment supprimer cette catégorie ?"

m l Category_Edit =
  case l of
    English -> "Edit an category"
    French  -> "Modifier une catégorie"

m l Category_Empty =
  case l of
    English -> "No category."
    French  -> "Aucune catégorie."

m l Category_Name =
  case l of
    English -> "Name"
    French  -> "Nom"

m l Category_NotDeleted =
  case l of
    English -> "The category could not have been deleted."
    French  -> "La catégorie n’a pas pu être supprimé."

m l Category_Title =
  case l of
    English -> "Categories"
    French  -> "Catégories"

m l Category_Used =
  case l of
    English -> "This category is currently being used"
    French  -> "Cette catégorie est actuellement utilisée"

m l (Date_Short day month year) =
  case l of
    English ->
      T.intercalate "-" [ padded year 4, padded month 2, padded day 2 ]
    French ->
      T.intercalate "/" [ padded day 2, padded month 2, padded year 4 ]
  where padded num pad =
          let str = show num
          in  T.pack $ replicate (pad - length str) '0' ++ str

m l (Date_ShortMonthAndYear month year) =
  case l of
    English ->
      T.intercalate "-" . map (T.pack . show) $ [ year, month ]
    French ->
      T.intercalate "/" . map (T.pack . show) $ [ month, year ]

m l (Date_Long day month year) =
  case l of
    English ->
      T.concat [ month, " " , T.pack . show $ day, ", ", T.pack . show $ year ]
    French ->
      T.intercalate " " [ T.pack . show $ day, month, T.pack . show $ year ]

m l Dialog_Confirm =
  case l of
    English -> "Confirm"
    French  -> "Confirmer"

m l Dialog_Undo =
  case l of
    English -> "Undo"
    French  -> "Annuler"

m l Error_CategoryCreate =
  case l of
    English -> "Error at category creation"
    French  -> "Erreur lors de la création de la catégorie"

m l Error_CategoryDelete =
  case l of
    English -> "Error at category deletion"
    French  -> "Erreur lors de la suppression de la catégorie"

m l Error_CategoryEdit =
  case l of
    English -> "Error at category edition"
    French  -> "Erreur lors de la modification de la catégorie"

m l Error_IncomeCreate =
  case l of
    English -> "Error at income creation"
    French  -> "Erreur lors de la création du revenu"

m l Error_IncomeDelete =
  case l of
    English -> "Error at income deletion"
    French  -> "Erreur lors de la suppression du revenu"

m l Error_IncomeEdit =
  case l of
    English -> "Error at income edition"
    French  -> "Erreur lors de la modification du revenu"

m l Error_PaymentCreate =
  case l of
    English -> "Error at payment creation"
    French  -> "Erreur lors de la création du paiement"

m l Error_PaymentDelete =
  case l of
    English -> "Error at payment deletion"
    French  -> "Erreur lors de la suppression du paiement"

m l Error_PaymentEdit =
  case l of
    English -> "Error at payment edition"
    French  -> "Erreur lors de la modification du paiement"

m l Error_SignOut =
  case l of
    English -> "Error at sign out"
    French  -> "Erreur lors de la déconnexion"

m l Form_AlreadyExists =
  case l of
    English -> "Dupplicate field"
    French  -> "Doublon"

m l Form_NonEmpty =
  case l of
    English -> "Required field"
    French  -> "Champ requis"

m l (Form_MinChars number) =
  case l of
    English -> T.concat [ "This field must contains at least ", T.pack . show $ number, " characters" ]
    French  -> T.concat [ "Ce champ doit contenir au moins ", T.pack . show $ number, " caractères" ]

m l Form_NonNullNumber =
  case l of
    English -> "Number must not be null"
    French  -> "Le nombre ne doit pas être nul"

m l (Form_GreaterIntThan number) =
  case l of
    English -> T.concat [ "Integer smaller than ", T.pack . show $ number, " or equal required" ]
    French  -> T.concat [ "Entier inférieur ou égal à ", T.pack . show $ number, " requis" ]

m l Form_InvalidCategory =
  case l of
    English -> "Invalid category"
    French  -> "Catégorie invalide"

m l Form_InvalidColor =
  case l of
    English -> "Invalid color"
    French  -> "Couleur invalide"

m l Form_InvalidDate =
  case l of
    English -> "Date required"
    French  -> "Date requise"

m l Form_InvalidInt =
  case l of
    English -> "Integer required"
    French  -> "Entier requis"

m l Form_InvalidString =
  case l of
    English -> "String required"
    French  -> "Chaîne de caractères requise"

m l (Form_SmallerIntThan number) =
  case l of
    English -> T.concat [ "Integer bigger than ", T.pack . show $ number, " or equal required" ]
    French  -> T.concat [ "Entier supérieur ou égal à ", T.pack . show $ number, " requis" ]

m l HttpError_BadPayload =
  case l of
    English -> "Bad payload server error"
    French  -> "Contenu inattendu en provenance du serveur"

m l HttpError_BadUrl =
  case l of
    English -> "URL not valid"
    French  -> "l’URL n’est pas valide"

m l HttpError_NetworkError =
  case l of
    English -> "Network can not be reached"
    French  -> "Le serveur n’est pas accessible"

m l HttpError_Timeout =
  case l of
    English -> "Timeout server error"
    French  -> "Le serveur met trop de temps à répondre"

m l Income_AddLong =
  case l of
    English -> "Add an income"
    French  -> "Ajouter un revenu"

m l Income_AddShort =
  case l of
    English -> "Add"
    French  -> "Ajouter"

m l Income_Name =
  case l of
    English -> "Name"
    French  -> "Nom"

m l Income_Amount =
  case l of
    English -> "Income"
    French  -> "Revenu"

m l Income_Clone =
  case l of
    English -> "Clone an income"
    French  -> "Cloner un revenu"

m l (Income_CumulativeSince since) =
  case l of
    English -> T.concat [ "Cumulative incomes since ", since ]
    French  -> T.concat [ "Revenus nets cumulés depuis le ", since ]

m l Income_Date =
  case l of
    English -> "Date"
    French  -> "Date"

m l Income_DeleteConfirm =
  case l of
    English -> "Are you sure to delete this income ?"
    French  -> "Voulez-vous vraiment supprimer ce revenu ?"

m l Income_Edit =
  case l of
    English -> "Edit an income"
    French  -> "Modifier un revenu"

m l Income_Empty =
  case l of
    English -> "No income."
    French  -> "Aucun revenu."

m l Income_MonthlyNet =
  case l of
    English -> "Net monthly incomes"
    French  -> "Revenus mensuels nets"

m l Income_Title =
  case l of
    English -> "Income"
    French  -> "Revenu"

m l Month_January =
  case l of
    English -> "january"
    French  -> "janvier"

m l Month_February =
  case l of
    English -> "february"
    French  -> "février"

m l Month_March =
  case l of
    English -> "march"
    French  -> "mars"

m l Month_April =
  case l of
    English -> "april"
    French  -> "avril"

m l Month_May =
  case l of
    English -> "may"
    French  -> "mai"

m l Month_June =
  case l of
    English -> "june"
    French  -> "juin"

m l Month_July =
  case l of
    English -> "july"
    French  -> "juillet"

m l Month_August =
  case l of
    English -> "august"
    French  -> "août"

m l Month_September =
  case l of
    English -> "september"
    French  -> "septembre"

m l Month_October =
  case l of
    English -> "october"
    French  -> "octobre"

m l Month_November =
  case l of
    English -> "november"
    French  -> "novembre"

m l Month_December =
  case l of
    English -> "december"
    French  -> "décembre"

m l PageNotFound_Title =
  case l of
    English -> "Page not found"
    French  -> "Page introuvable"

m l Payment_Add =
  case l of
    English -> "Add a payment"
    French  -> "Ajouter un paiement"

m l Payment_Balanced =
  case l of
    English -> "Payments are balanced."
    French  -> "Les paiements sont équilibrés."

m l (Payment_By key value) =
  case l of
    English -> T.concat [ key, ": ", value ]
    French  -> T.concat [ key, " : ", value ]

m l Payment_Category =
  case l of
    English -> "Category"
    French  -> "Catégorie"

m l Payment_CloneLong =
  case l of
    English -> "Clone a payment"
    French  -> "Cloner un paiement"

m l Payment_CloneShort =
  case l of
    English -> "Clone"
    French  -> "Cloner"

m l Payment_Cost =
  case l of
    English -> "Cost"
    French  -> "Coût"

m l Payment_Date =
  case l of
    English -> "Date"
    French  -> "Date"

m l Payment_Delete =
  case l of
    English -> "Delete"
    French  -> "Supprimer"

m l Payment_DeleteConfirm =
  case l of
    English -> "Are you sure to delete this payment ?"
    French  -> "Voulez-vous vraiment supprimer ce paiement ?"

m l Payment_EditLong =
  case l of
    English -> "Edit a payment"
    French  -> "Modifier un paiement"

m l Payment_EditShort =
  case l of
    English -> "Edit"
    French  -> "Modifier"

m l Payment_Empty =
  case l of
    English -> "No payment found from your search criteria."
    French  -> "Aucun paiement ne correspond à vos critères de recherches."

m l Payment_Frequency =
  case l of
    English -> "Frequency"
    French  -> "Fréquence"

m l Payment_InvalidFrequency =
  case l of
    English -> "Invalid frequency"
    French  -> "Fréquence invalide"

m l Payment_Many =
  case l of
    English -> "payments"
    French  -> "paiements"

m l Payment_MonthlyFemale =
  case l of
    English -> "Monthly"
    French  -> "Mensuelle"

m l Payment_MonthlyMale =
  case l of
    English -> "Monthly"
    French  -> "Mensuel"

m l Payment_Name =
  case l of
    English -> "Name"
    French  -> "Nom"

m l Payment_NotDeleted =
  case l of
    English -> "The payment could not have been deleted."
    French  -> "Le paiement n’a pas pu être supprimé."

m l Payment_One =
  case l of
    English -> "payment"
    French  -> "paiement"

m l Payment_PunctualFemale =
  case l of
    English -> "Punctual"
    French  -> "Ponctuelle"

m l Payment_PunctualMale =
  case l of
    English -> "Punctual"
    French  -> "Ponctuel"

m l Payment_Title =
  case l of
    English -> "Payments"
    French  -> "Paiements"

m l Payment_User =
  case l of
    English -> "Payer"
    French  -> "Payeur"

m l (Payment_Worth subject amount) =
  case l of
    English -> T.concat [ subject, " worth ", amount ]
    French  -> T.concat [ subject, " comptabilisant ", amount ]

m l Search_Monthly =
  case l of
    English -> "Monthly"
    French  -> "Mensuel"

m l Search_Name =
  case l of
    English -> "Search"
    French  -> "Recherche"

m l Search_Punctual =
  case l of
    English -> "Punctual"
    French  -> "Ponctuel"

m l Secure_Unauthorized =
  case l of
    English -> "You are not authorized to sign in."
    French  -> "Tu n’es pas autorisé à te connecter."

m l Secure_Forbidden =
  case l of
    English -> "You need to be logged in to perform this action"
    French  -> "Tu dois te connecter pour effectuer cette action"

m l SignIn_Button =
  case l of
    English -> "Sign in"
    French  -> "Connexion"

m l SignIn_DisconnectSuccess =
  case l of
    English -> "You have successfully disconnected"
    French  -> "Vous êtes à présent déconnecté."

m l SignIn_EmailInvalid =
  case l of
    English -> "Your email is not valid."
    French  -> "Votre courriel n’est pas valide."

m l SignIn_EmailLabel =
  case l of
    English -> "Email"
    French  -> "Courriel"

m l SignIn_EmailSendFail =
  case l of
    English -> "You are authorized to sign in, but we failed to send you the sign up email."
    French  -> "Tu es autorisé à te connecter, mais nous n’avons pas pu t’envoyer le courriel de connexion."

m l SignIn_EmailSent =
  case l of
    English -> "We sent you an email with a connexion link."
    French  -> "Nous t’avons envoyé un courriel avec un lien pour te connecter."

m l SignIn_LinkExpired =
  case l of
    English -> "The link expired, please sign in again."
    French  -> "Le lien sur lequel tu as cliqué a expiré, connecte-toi à nouveau."

m l SignIn_LinkInvalid =
  case l of
    English -> "The link is invalid, please sign in again."
    French  -> "Le lien sur lequel tu as cliqué est invalide, connecte-toi à nouveau."

m l SignIn_LinkUsed =
  case l of
    English -> "You already used this link, please sign in again."
    French  -> "Tu as déjà utilisé ce lien, connecte-toi à nouveau."

m l SignIn_MailTitle =
  case l of
    English -> T.concat [ "Sign in to ", m l App_Title ]
    French  -> T.concat [ "Connexion à ", m l App_Title ]

m l (SignIn_MailBody name url) =
  T.intercalate
    "\n"
    ( case l of
        English ->
          [ T.concat [ "Hi ", name, "," ]
          , ""
          , T.concat
              [ "Click to the following link in order to sign in to Shared Cost:"
              , m l App_Title
              , ":"
              ]
          , url
          , ""
          , "See you soon!"
          ]
        French  ->
          [ T.concat [ "Salut ", name, "," ]
          , ""
          , T.concat
              [ "Clique sur le lien suivant pour te connecter à "
              , m l App_Title
              , ":"
              ]
          , url
          , ""
          , "À très vite !"
          ]
    )

m l SignIn_ParseError =
  case l of
    English -> "Error while reading initial data."
    French  -> "Erreur lors de la lecture des données initiales."

m l (Statistic_ByMonthsAndMean amount) =
  case l of
    English ->
      T.concat [ "Payments by category by month months (", amount, "on average)" ]
    French  ->
      T.concat [ "Paiements par catégorie par mois (en moyenne ", amount, ")" ]

m l Statistic_Title =
  case l of
    English -> "Statistics"
    French  -> "Statistiques"

m l Statistic_Total =
  case l of
    English -> "Total"
    French  -> "Total"

m l WeeklyReport_Empty =
  case l of
    English -> "No activity the previous week."
    French  -> "Pas d’activité la semaine passée."

m l (WeeklyReport_IncomesCreated count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " incomes created:" ]
    French  -> T.concat [ T.pack . show $ count, " revenus créés :" ]

m l (WeeklyReport_IncomesDeleted count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " incomes deleted:" ]
    French  -> T.concat [ T.pack . show $ count, " revenus supprimés :" ]

m l (WeeklyReport_IncomesEdited count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " incomes edited:" ]
    French  -> T.concat [ T.pack . show $ count, " revenus modifiés :" ]

m l (WeeklyReport_IncomeCreated count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " income created:" ]
    French  -> T.concat [ T.pack . show $ count, " revenu créé :" ]

m l (WeeklyReport_IncomeDeleted count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " income deleted:" ]
    French  -> T.concat [ T.pack . show $ count, " revenu supprimé :" ]

m l (WeeklyReport_IncomeEdited count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " income edited:" ]
    French  -> T.concat [ T.pack . show $ count, " revenu modifié :" ]

m l (WeeklyReport_PayedFor name amount for at) =
  case l of
    English -> T.concat [ name, " payed ", amount, " for “", for, "” at ", at ]
    French  -> T.concat [ name, " a payé ", amount, " concernant « ", for, " » le ", at ]

m l (WeeklyReport_PayedForNot name amount for at) =
  case l of
    English -> T.concat [ name, " didn’t pay ", amount, " for “", for, "” at ", at ]
    French  -> T.concat [ name, " n’a pas payé ", amount, " concernant « ", for, " » le ", at ]

m l (WeeklyReport_PayedFrom name amount for) =
  case l of
    English -> T.concat [ name, " is payed ", amount, " of net monthly income from ", for ]
    French  -> T.concat [ name, " est payé ", amount, " net par mois à partir du ", for ]

m l (WeeklyReport_PayedFromNot name amount for) =
  case l of
    English -> T.concat [ name, " isn’t payed ", amount, " of net monthly income from ", for ]
    French  -> T.concat [ name, " n’est pas payé ", amount, " net par mois à partir du ", for ]

m l (WeeklyReport_PaymentsCreated count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " payments created:" ]
    French  -> T.concat [ T.pack . show $ count, " paiements créés :" ]

m l (WeeklyReport_PaymentsDeleted count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " payments deleted:" ]
    French  -> T.concat [ T.pack . show $ count, " paiements supprimés :" ]

m l (WeeklyReport_PaymentsEdited count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " payments edited:" ]
    French  -> T.concat [ T.pack . show $ count, " paiements modifiés :" ]

m l (WeeklyReport_PaymentCreated count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " payment created:" ]
    French  -> T.concat [ T.pack . show $ count, " paiement créé :" ]

m l (WeeklyReport_PaymentDeleted count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " payment deleted:" ]
    French  -> T.concat [ T.pack . show $ count, " paiement supprimé :" ]

m l (WeeklyReport_PaymentEdited count) =
  case l of
    English -> T.concat [ T.pack . show $ count, " payment edited:" ]
    French  -> T.concat [ T.pack . show $ count, " paiement modifié :" ]

m l WeeklyReport_Title =
  case l of
    English -> "Weekly report"
    French  -> "Rapport hebdomadaire"

m l NotFound_Message =
  case l of
    English -> "There is nothing here!"
    French  -> "Vous vous êtes perdu."

m l NotFound_LinkMessage =
  case l of
    English -> "Go back to the home page."
    French  -> "Retour à l’accueil."