<?php

/*
 * This file is part of RaspiSMS.
 *
 * (c) Pierre-Lin Bonnemaison <plebwebsas@gmail.com>
 *
 * This source file is subject to the GPL-3.0 license that is bundled
 * with this source code in the file LICENSE.
 */

namespace models;

    class PhoneGroup extends StandardModel
    {
        /**
         * Return a list of phone groups for a user.
         * Add a column nb_phone.
         *
         * @param int  $id_user : user id
         * @param ?int $limit   : Number of entry to return or null
         * @param ?int $offset  : Number of entry to ignore or null
         * @param ?int $after_id  : If provided use where id > $after_id instead of offset 
         * @param ?int $before_id  : If provided use where id < $before_id instead of offset 
         *
         * @return array
         */
        public function list_for_user(int $id_user, $limit, $offset, ?int $after_id = null, ?int $before_id = null)
        {
            $query = '
                SELECT pg.*, COUNT(pgp.id) as nb_phone
                FROM `phone_group` as pg
                LEFT JOIN phone_group_phone as pgp
                ON pg.id = pgp.id_phone_group
                WHERE pg.id_user = :id_user
            ';

            $params = [
                'id_user' => $id_user,
            ];

            if ($after_id || $before_id)
            {
                $offset = null;
            }

            if ($after_id)
            {
                $query .= '
                    AND pg.id > :after_id
                    GROUP BY pg.id
                    ORDER BY g.id
                ';
                $params['after_id'] = $after_id;
            }
            elseif ($before_id)
            {
                $query .= '
                    AND pg.id < :before_id
                    GROUP BY pg.id
                    ORDER BY g.id DESC
                ';
                $params['before_'] = $before_id;
            }
            else
            {
                $query .= ' 
                    GROUP BY pg.id
                    ORDER BY pg.id
                ';
            }

            if (null !== $limit)
            {
                $limit = (int) $limit;

                $query .= ' LIMIT ' . $limit;
                if (null !== $offset)
                {
                    $offset = (int) $offset;
                    $query .= ' OFFSET ' . $offset;
                }
            }

            if ($before_id)
            {
                return array_reverse($this->_run_query($query, $params));
            }

            return $this->_run_query($query, $params);
        }

        /**
         * Return a phone group by his name for a user.
         *
         * @param int    $id_user : User id
         * @param string $name    : Group name
         *
         * @return array
         */
        public function get_by_name_for_user(int $id_user, string $name)
        {
            return $this->_select_one($this->get_table_name(), ['id_user' => $id_user, 'name' => $name]);
        }

        /**
         * Delete relations between phone group and phone for a group.
         *
         * @param int $id_phone_group : Group id
         *
         * @return int : Number of deleted rows
         */
        public function delete_phone_group_phone_relations(int $id_phone_group)
        {
            return $this->_delete('phone_group_phone', ['id_phone_group' => $id_phone_group]);
        }

        /**
         * Insert a relation between a phone group and a phone.
         *
         * @param int $id_phone_group   : Phone Group id
         * @param int $id_phone : Phone id
         *
         * @return mixed (bool|int) : False on error, new row id else
         */
        public function insert_phone_group_phone_relation(int $id_phone_group, int $id_phone)
        {
            $success = (bool) $this->_insert('phone_group_phone', ['id_phone_group' => $id_phone_group, 'id_phone' => $id_phone]);

            return $success ? $this->_last_id() : false;
        }

        /**
         * Get phone groups phones.
         *
         * @param int $id_phone_group : Phone Group id
         *
         * @return array : Phones of the group
         */
        public function get_phones(int $id_phone_group)
        {
            $query = '
                SELECT *
                FROM `phone`
                WHERE id IN (SELECT id_phone FROM `phone_group_phone` WHERE id_phone_group = :id_phone_group)
            ';

            $params = ['id_phone_group' => $id_phone_group];

            return $this->_run_query($query, $params);
        }

        /**
         * Return table name.
         */
        protected function get_table_name(): string
        {
            return 'phone_group';
        }
    }
