###############################################################################
#   @author         :   Jeffrey Stone 
#   @date           :   02/19/2019
#   @package        :   USPS
#   @description    :   Notifies us of mails and packages.
#                       Package modified from https://github.com/skalavala/smarthome/blob/master/packages/usps.yaml
###############################################################################

homeassistant:
  customize:
    sensor.usps_mail:
      friendly_name: USPS Mail
      icon: mdi:mailbox
    sensor.usps_packages:
      friendly_name: USPS Packages
      icon: mdi:package-variant

sensor:
  - platform: mqtt
    name: 'USPS Mail'
    state_topic: 'house/usps/mails'
    value_template: "{{ value }}"

  - platform: mqtt
    name: USPS Packages
    state_topic: 'house/usps/packages'
    value_template: "{{ value }}"

  - platform: template
    sensors:
      mail_deliveries_message:
        friendly_name: "Deliveries Summary"
        value_template: > 
          {# Deliveries Sentence #}
            {% macro deliveries_sentence() -%}
                  {%- if states("sensor.mail_usps_mail")|int == 0 -%}
                    No
                  {%- else -%}
                    {{states("sensor.mail_usps_mail")|int}}
                  {%- endif -%}
                {{' '}} 
                  {%- if states("sensor.mail_usps_mail")|int <= 1 -%}
                    piece of mail
                  {%- else -%}
                    pieces of mail
                  {%- endif -%}
                {{' '}}will be delivered.{{' '}} 
                  {%- if states("sensor.mail_usps_delivering")|int == 0 -%}
                    No
                  {%- else -%}
                    {{states("sensor.mail_usps_delivering")|int}}
                  {%- endif -%}
                {{' '}} 
                  {%- if states("sensor.mail_usps_delivering")|int == 1 -%}
                    USPS package is
                  {%- else -%}
                    USPS packages are
                  {%- endif -%}
                {{' '}}in transit.{{' '}}
                  {%- if states("sensor.mail_fedex_delivering_2")|int == 0 -%}
                    No
                  {%- else -%}
                    {{states("sensor.mail_fedex_delivering_@")|int}}
                  {%- endif -%}
                {{' '}} 
                  {%- if states("sensor.mail_fedex_delivering_2")|int == 1 -%}
                    FedEx package is
                  {%- else -%}
                    Fedex packages are
                  {%- endif -%}
                {{' '}}in transit.{{' '}}
                {%- if states("sensor.mail_ups_delivering")|int == 0 -%}
                    No
                  {%- else -%}
                    {{states("sensor.mail_ups_delivering")|int}}
                  {%- endif -%}
                {{' '}} 
                  {%- if states("sensor.mail_ups_delivering")|int == 1 -%}
                    UPS package is
                  {%- else -%}
                    UPS packages are
                  {%- endif -%}
                {{' '}}in transit.{{' '}}
                {%- if states("sensor.mail_amazon_packages")|int == 0 -%}
                    No
                  {%- else -%}
                    {{states("sensor.mail_amazon_packages")|int}}
                  {%- endif -%}
                {{' '}} 
                  {%- if states("sensor.mail_amazon_packages")|int == 1 -%}
                    Amazon package is
                  {%- else -%}
                    Amazon packages are
                  {%- endif -%}
                {{' '}}in transit.{{' '}}
            {%- endmacro %}
          {{deliveries_sentence()}}

camera:
  - platform: generic
    name: USPS Mail Pictures
    still_image_url: !secret usps_camera_url

  - platform: local_file
    file_path: /config/images/mail_today.gif
    name: mail_usps

automation:

  - id: update_usps_camera_path
    alias: "Update USPS Mail Camera"
    trigger:
      - platform: state
        entity_id: sensor.mail_usps_mail
    action:
      - service: local_file.update_file_path
        data_template:
          entity_id: camera.mail_usps
          file_path: >
            {% if state_attr('sensor.mail_usps_mail','image') == None  %}
            /config/custom_components/mail_and_packages/mail_none.gif
            {% else %}
            /config/www/mail_and_packages/{{ state_attr('sensor.mail_usps_mail','image') }}
            {% endif %}

# Notify USPS mails via TTS, and iOS notification with attachment
###############################################################################
  - id: notify_usps_mail
    alias: Notify USPS Mail
    initial_state: true
    trigger:
      - platform: state
        entity_id: sensor.usps_mail
    condition:
      - condition: template
        value_template: '{{ states.sensor.usps_mail.state | int > 0 }}'
      - condition: template
        value_template: '{{ ((now().hour | int) > 7) and ((now().hour | int) < 16) }}'
    action:
      - service: script.status_annc
        data:
          who: '{{ states.sensor.room_audio.state }}'
          call_interuption: 1
          speech_message: >-
            {%- if states.sensor.usps_mail.state | int == 1 -%} 
              {{ [ 
                "USPS is delivering", 
                "The postal service will be leaving",
                "The nice lady in the mail truck is bringing us ",
                "I have scanned the incoming mail, eliminated the junk, and determined there is"
                  ] | random }}
              {{ states.sensor.usps_mail.state }} piece of mail today.
            {%- else -%}
              {{ [ 
                "USPS is delivering", 
                "The postal service will be leaving",
                "The nice lady in the mail truck is bringing us ",
                "I have scanned the incoming mail, eliminated the junk, and determined there are"
                  ] | random }} 
              {{ states.sensor.usps_mail.state }} pieces of mail today.
            {%- endif -%}
      - service: script.text_notify
        data_template:
          who: "jeff"
          title: "USPS Delivering Today"
          message: "USPS will be delivering {{ states.sensor.usps_mail.state }} piece(s) of mail today."
          # data:
          #   push:
          #     category: camera
          #   entity_id: "camera.usps_mail_pictures"
          #   attachment:
          #     url: "{{ states.camera.usps_mail_pictures.attributes.entity_picture }}"
          #     content-type: jpg
      - service: script.twitter_notify
        data_template:
          message: >-
            {{ [ 
            "I just let Anchorage House know how much mail the USPS is leaving in the mailbox today. For the code checkout https://github.com/thejeffreystone/usps2mqtt #automation", 
            "One of the things I know is how much mail is being delivered because I am integrated with USPS Informed Delivery using https://github.com/thejeffreystone/usps2mqtt #automation.",
            "There is a letter in the mailbox. Or will be when the USPS gets here. If you want to know how I know checkout https://github.com/thejeffreystone/usps2mqtt #automation.",
            "Neither snow nor rain nor heat nor gloom of night prevents me from letting Anchorage House know what to expect from the USPS thanks to https://github.com/thejeffreystone/usps2mqtt #automation."
            ] | random }}

# Notify USPS packages via TTS. Usually there are no pictures for packages
###############################################################################
  - id: notify_usps_packages
    alias: Notify USPS Packages
    initial_state: true
    trigger:
      - platform: state
        entity_id: sensor.usps_mail
    condition:
      - condition: template
        value_template: '{{ states.sensor.usps_mail.state | int > 0 }}'
      - condition: template
        value_template: '{{ ((now().hour | int) > 7) and ((now().hour | int) < 16) }}'
    action:
      - service: script.status_annc
        data_template:
          who: '{{ states.sensor.room_audio.state }}'
          call_interuption: 1
          speech_message: >
            {%- if states.sensor.usps_packages.state | int == 1 -%}
              USPS is delivering {{ states.sensor.usps_packages.state }} package today.
            {%- else -%}
              USPS is delivering {{ states.sensor.usps_packages.state }} packages today.
            {%- endif -%}
      
  - alias: "Mail Notif - Mail Delieveries"
    trigger:
      - platform: time
        at: '10:00:00'
    #Trigger if mail or packages get updated
      # - platform: state
      #   entity_id: sensor.mail_usps_mail
      # - platform: state
      #   entity_id: sensor.mail_usps_delivering
    #send only if mail or packages are more than 0
    condition:
      - condition: or
        conditions:
          - condition: template
            value_template: "{{ states('sensor.mail_usps_mail') | int > 0 }}"
          - condition: template
            value_template: "{{ states('sensor.mail_usps_delivering') | int > 0 }}"
    action:
      - service: script.text_notify
        data_template:
          who: "jeff"
          title: "Delivering Today"
          message: "{{ states('sensor.mail_deliveries_message')}}"
      - service: script.status_annc
        data_template:
          who: '{{ states.sensor.room_audio.state }}'
          call_interuption: 1
          speech_message: >-
            {%- if states.sensor.mail_usps_mail.state | int == 1 -%} 
              {{ [ 
                "USPS is delivering", 
                "The postal service will be leaving",
                "The nice lady in the mail truck is bringing us ",
                "I have scanned the incoming mail,and there is"
                  ] | random }}
              {{ states.sensor.mail_usps_mail.state }} piece of mail today.
            {%- else -%}
              {{ [ 
                "USPS is delivering", 
                "The postal service will be leaving",
                "The nice lady in the mail truck is bringing us ",
                "I have scanned the incoming mail, and determined there are"
                  ] | random }} 
              {{ states.sensor.mail_usps_mail.state }} pieces of mail today.
            {%- endif -%}
        

  - alias: "Delivered Package Notification"
    initial_state: true
    trigger:
      - platform: state
        entity_id: sensor.mail_fedex_delivered_2
      - platform: state
        entity_id: sensor.mail_ups_delivered
    #send only if mail or packages are more than 0
    condition:
      - condition: or
        conditions:
          - condition: template
            value_template: "{{ states('sensor.mail_fedex_delivered_2') | int > 0 }}"
          - condition: template
            value_template: "{{ states('sensor.mail_ups_delivered') | int > 0 }}"
    action:
      - service: script.text_notify
        data_template:
          who: "jeff"
          title: "Package Delivered"
          message: "Fedex/UPS just made a delivery"
      - service: script.status_annc
        data_template:
          who: '{{ states.sensor.room_audio.state }}'
          speech_message: >-
              A package was just left on the porch.
          call_interuption: 1