# encoding: ascii
# api: powershell
# title: FAQ
# description: A simple datastorage module for the #PowerShell IRC bot which serves as a simple example of how to use Beefarino’s SQLite Provider
# version: 0.1
# type: module
# author: Joel Bennett
# license: CC0
# function: New-FAQ
# x-poshcode-id: 4816
# x-archived: 2014-01-22T05:42:43
# x-published: 2014-01-19T18:48:00
#
# This release: Updated because Set-FAQ wasn’t working right.
#
#requires -Module SQLite

if(!(Test-Path data:)) {
   Mount-SQLite -name data -dataSource data.sqlite
}
if(!(Test-Path data:\FAQ)) {
   new-item data:\FAQ -Value @{ Question="TEXT UNIQUE NOT NULL"; Answer="TEXT NOT NULL" }
   New-FAQ "best powershell books" @"
For beginners: http://powershell.com/cs/blogs/ebook/ (Free) or Don's Month of Lunches book http://j.mp/1kEBG3z
For intermediate: PowerShell Toolmaking http://j.mp/1i29RAh More Free eBooks http://j.mp/1m9deTr
For experts: PowerShell In Action http://www.manning.com/payette2/
For developers: Doug's PowerShell for Developers http://j.mp/1dhUwXO, best powershell books
"@   
}


function New-FAQ { 
   #.Synopsis
   #  Adds a question and answer to the FAQ list
   param(
      # A short question
      [Parameter(Mandatory,Position=0)]
      [String]$Question,

      # Less than five lines of answer
      [Parameter(Mandatory,Position=1,ValueFromPipeline)]
      [String[]]$Answer
   )
   begin { 
      $Question = $Question.ToLowerInvariant() -replace "[^\p{L} ]"
      $FullAnswer = "" 
   }
   process { $FullAnswer = @(@($FullAnswer) + $Answer) -Join "`n" }
   end {
      $Result = New-Item data:\FAQ -Question $Question -Answer $FullAnswer -ErrorAction SilentlyContinue -ErrorVariable Failed
      if($Failed) {
         Write-Warning $($Failed.Exception.Message -split "[\r\n]+" -join ": ")
      } else {
         "Added: {0}" -f $Result.Question
      }
   }
}

function Set-FAQ { 
   #.Synopsis
   #  Changes the answer to a question on the FAQ list
   param(
      # A short question
      [Parameter(Mandatory,Position=0)]
      [String]$Question,

      # Less than five lines of answer
      [Parameter(Mandatory,Position=1,ValueFromPipeline)]
      [String]$Answer
   )
   begin { 
      $Question = $Question.ToLowerInvariant() -replace "[^\p{L} ]"
      $FullAnswer = @()
   }
   process { $FullAnswer = @(@($FullAnswer) + $Answer) -Join "`n" }
   end {
      $Result = Set-Item data:\FAQ -Filter "Question='$Question'" -Value @{Answer=$FullAnswer} -ErrorAction SilentlyContinue -ErrorVariable Failed -Passthru

      if($Failed) {
         Write-Warning $($Failed.Exception.Message -split "[\r\n]+" -join ": ")
      } else {
         "Set: {0}" -f $Result.Question
      }
   }
}

function Get-FAQ {
   #.Synopsis
   #  Returns a specific FAQ (the first one that matches)
   param(
      # A short question
      [Parameter(Position=0,ValueFromPipeline)]
      [String]$Question
   )
   if($Question -as [int]) {
      Get-Item data:\FAQ\$Question | % Answer
   } elseif($Question) {
      $Question = $Question.ToLowerInvariant() -replace "[^\p{L} ]"
      Get-Item -Path data:\FAQ -filter "Question = '${Question}'" | % Answer
   } else {
      "Available FAQs: {0}" -f ((Get-ChildItem -Path data:\FAQ | % Question) -join ", ")
   }
}

Set-Alias FAQ Search-FAQ
function Search-FAQ {
   #.Synopsis
   #  Returns a specific FAQ (the first one that matches)
   param(
      # A short question
      [Parameter(Position=0,ValueFromRemainingArguments,ValueFromPipeline)]
      [String[]]$Question
   )
   if($Question) {
      [String]$Question = ($Question | % ToLowerInvariant) -join "%" -replace '\*','%' -replace "[^\p{L} %]"
      $FAQs = Get-Item -Path data:\FAQ -filter "Question like '%${Question}%'"
   } else {
      "Available FAQs: {0}" -f ((Get-ChildItem -Path data:\FAQ | % Question) -join ", ")
   }

   switch (@($FAQs).Count) {
      1 { $FAQs.Answer }
      0 { "Couldn't find any FAQ matching ${Question}"}
      default { "I found more than one matching question: {0}" -f $(($FAQs | % Question) -join ", ") }
   }   
}

Export-ModuleMember -Function * -Alias *
