//
//  File:   hzUrl.h
//
//  Legal Notice: This file is part of the HadronZoo C++ Class Library.
//
//  Copyright 2025 HadronZoo Project (http://www.hadronzoo.com)
//
//  The HadronZoo C++ Class Library is free software: You can redistribute it, and/or modify it under the terms of the GNU Lesser General Public License, as published by the Free
//  Software Foundation, either version 3 of the License, or any later version.
//
//  The HadronZoo C++ Class Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
//  A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public License along with the HadronZoo C++ Class Library. If not, see http://www.gnu.org/licenses.
//
#ifndef hzUrl_h
#define hzUrl_h
//  Other Includes
#include "hzBasedefs.h"
#include "hzString.h"
/*
**  Universal Resource Locator (URL)
*/
class   hzUrl
{
    //  Category:   Data
    //
    //  The hzUrl class holds URL (Universal Resource Locator) values, which have the general form "[protocol]domain[port][resource]" - e.g. https://www.mydomain.com:8434/contacts.
    //  In this example 'https://' is the protocol, 'www.domain.com' is the domain, ':8434' is the port and '/contacts' is the resource. To qualify as a URL, a string only needs to
    //  contain the domain. The port is only needed if it differs from the standard port used by the protocol. If the protocol is omitted it is taken as https://, or http:// if the
    //  website in question does not support HTTPS. If the resource is not stated, the website homepage is assumed.
    //
    //  Note that the domain can be stated as an IP address, which complicates URL validation. Note also that the reource part can be complex. It need not be a simple set of one or
    //  more strings separated by a forward slash representing 'directories' relative to the root for the domain. The resource can go on to include additional qualifiers consisting
    //  of one or more name-value pairs delimited by the query character. For this reason industy standards for URL maximum size, vary around the 2,000 mark.
    //
    //  This large maximum size has implications for the HDB and the Dissemino Web Engine.
    //
    //  hzUrl is considered to be a 'string-like' data type. URLs are a special case of a string, and the hzUrl class has the same structure and MO as the hzString class - i.e. it
    //  has a single member being a smart pointer to an internal structure that incorporates both the value and control parameters.
    uint32_t    m_addr ;        //  Address of data and control space
public:
    //  Set methods (and validate). These accept both the standard forms and the filename form.
    void    Clear       (void) ;
    hzUrl&  SetValue    (const hzString domain, const hzString resource, bool secure = false, uint32_t port = 0) ;
    hzUrl&  operator=   (const char* cpStr) ;
    hzUrl&  operator=   (const hzString& S) ;
    hzUrl&  operator=   (const hzUrl& E) ;
    //  Constructors
    hzUrl   (void)                  { m_addr = 0 ; }
    hzUrl   (const hzUrl& op)       { m_addr = 0 ; operator=(op) ; }
    hzUrl   (const char* cpUrl)     { m_addr = 0 ; operator=(cpUrl) ; }
    hzUrl   (const hzString& url)   { m_addr = 0 ; operator=(url) ; }
    //  Destructors
    ~hzUrl  (void)  { Clear() ; }
    //  Internal use only
    uint32_t    _int_addr   (void) const    { return m_addr ; }
    void        _int_set    (uint32_t addr) { m_addr = addr ; }
    void        _int_clr    (void)          { m_addr = 0 ; }
    void        _inc_copy   (void) const ;
    void        _dec_copy   (void) const ;
    bool        valid       (void) const ;
    //  Get functions
    uint32_t    Length  (void) const ;  //  Return total length of URL (including the http:// or https:// sequence)
    uint32_t    Port    (void) const ;  //  Return port number
    bool        IsSSL   (void) const ;  //  Does the URL require SSL?
    //  Get value in a form suitable for a filename (for storage)
    hzString    Filename    (void) const ;
    //  Get part or whole value (not available in direct text due to internal format)
    hzString    Whole       (void) const ;
    hzString    Domain      (void) const ;
    hzString    Resource    (void) const ;
    /*
    **  Compare Operators
    */
    //  These compare domains first
    bool    operator==  (const hzUrl& E) const ;
    bool    operator<   (const hzUrl& E) const ;
    bool    operator<=  (const hzUrl& E) const ;
    bool    operator>   (const hzUrl& E) const ;
    bool    operator>=  (const hzUrl& E) const ;
    //  Normal string compares
    bool    operator==  (const char* cpStr) const ;
    bool    operator!=  (const char* cpStr) const ;
    bool    operator==  (const hzString& S) const ;
    bool    operator!=  (const hzString& S) const ;
    //  Casting Operators
    bool        operator!   (void) const    { return m_addr ? false : true ; }
    const char* operator*   (void) const ;
    operator const char*    (void) const ;
    //  Friend operator functions
    friend  _atomval    atomval_hold    (const hzUrl& url) ;
    friend  std::ostream&   operator<<  (std::ostream& os, const hzUrl& url) ;
} ;
//  Convienent globals always at null
extern  const   hzUrl   _hz_null_hzUrl ;        //  Null URL
#endif  //  hzUrl_h