openapi: 3.1.0
info:
  title: FlyingCarpet API
  description: >
    API ציבורי של "השטיח המעופף" להצגת מסלולים מאורגנים, חבילות נופש, מאמרי תוכן,
    קטגוריות, יעדים, לוחות שנה ותוצאות חיפוש דינמיות.
    מיועד גם למנועי AI וגם למפתחים.
  version: 1.0.0

servers:
  - url: https://www.isrfly.com/API
    description: Production server

paths:
  # ===== ITINERARY =====
  /itinerary.php:
    get:
      operationId: getItineraries
      summary: קבלת כל המסלולים
      parameters:
        - in: query
          name: limit
          schema: { type: integer }
        - in: query
          name: offset
          schema: { type: integer }
      responses:
        "200":
          description: רשימת מסלולים
          content:
            application/json:
              schema:
                type: object
                properties:
                  status: { type: string }
                  itineraries:
                    type: array
                    items:
                      $ref: "#/components/schemas/Itinerary"

  /itinerary.php/{id}:
    get:
      operationId: getItineraryById
      summary: קבלת מסלול לפי מזהה
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: integer }
      responses:
        "200":
          description: פרטי מסלול בודד
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Itinerary"

  /itinerary.php/search:
    get:
      operationId: searchItineraryByDestination
      summary: חיפוש מסלול לפי יעד
      parameters:
        - in: query
          name: destination
          required: true
          schema: { type: string }
      responses:
        "200":
          description: מסלולים לפי יעד
          content:
            application/json:
              schema:
                type: object
                properties:
                  itineraries:
                    type: array
                    items:
                      $ref: "#/components/schemas/Itinerary"

  # ===== ARTICLES =====
  /article_versions_api.php:
    get:
      operationId: getArticles
      summary: קבלת כל המאמרים
      parameters:
        - in: query
          name: limit
          schema: { type: integer }
        - in: query
          name: offset
          schema: { type: integer }
      responses:
        "200":
          description: רשימת מאמרים
          content:
            application/json:
              schema:
                type: object
                properties:
                  articles:
                    type: array
                    items:
                      $ref: "#/components/schemas/Article"

  /article_versions_api.php/{id}:
    get:
      operationId: getArticleById
      summary: קבלת מאמר לפי מזהה
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: integer }
      responses:
        "200":
          description: פרטי מאמר
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Article"

  /article_versions_api.php/search:
    get:
      operationId: searchArticles
      summary: חיפוש מאמר לפי טקסט
      parameters:
        - in: query
          name: query
          required: true
          schema: { type: string }
      responses:
        "200":
          description: מאמרים מתאימים
          content:
            application/json:
              schema:
                type: object
                properties:
                  articles:
                    type: array
                    items:
                      $ref: "#/components/schemas/Article"

  # ===== OPERATION API =====
  /operation/packCategoryTop:
    get:
      operationId: getPackCategories
      summary: קבלת קטגוריות חבילות
      responses:
        "200":
          description: רשימת קטגוריות
          content:
            application/json:
              schema:
                type: object
                properties: {}

  /operation/packDates/bySubjectsCities:
    get:
      operationId: getPackDatesBySubjectsCities
      summary: קבלת לוח שנה לפי subjectCode ויעד
      parameters:
        - in: query
          name: subjectCode
          required: true
          schema: { type: string }
        - in: query
          name: destCode
          required: true
          schema: { type: string }
      responses:
        "200":
          description: לוח שנה זמין
          content:
            application/json:
              schema:
                type: object
                properties: {}

  /operation/dynPack/search/vacation:
    post:
      operationId: searchDynPack
      summary: חיפוש חבילות דינמיות
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties: {}
      responses:
        "200":
          description: תוצאות חיפוש חבילות
          content:
            application/json:
              schema:
                type: object
                properties: {}

  # ===== LOCAL API =====
  /packs.php:
    get:
      operationId: getPackDatesLocal
      summary: קבלת לוח שנה עם תאריכים לפי קוד נושא ויעד
      parameters:
        - in: query
          name: subjectCode
          required: true
          schema: { type: string }
        - in: query
          name: destCode
          required: true
          schema: { type: string }
      responses:
        "200":
          description: לוח שנה זמין
          content:
            application/json:
              schema:
                type: object
                properties:
                  status: { type: string }
                  calendar:
                    type: array
                    items:
                      type: object
                      properties:
                        date: { type: string, format: date }
                        price: { type: number }

  /category_packs_light.php:
    get:
      operationId: getCategoryPacksLight
      summary: טיולים מאורגנים לייט – רשימת טיולים עם יעדים, שמות ותאריכים
      parameters:
        - in: query
          name: subjectId
          required: true
          schema: { type: string }
      responses:
        "200":
          description: רשימת טיולים מאורגנים בפורמט קומפקטי
          content:
            application/json:
              schema:
                type: object
                properties: {}

  /search_light.php:
    get:
      operationId: searchLight
      summary: חיפוש חבילות קל (תאריכים ומחירים בלבד)
      parameters:
        - in: query
          name: dest
          required: true
          schema: { type: string }
        - in: query
          name: out
          required: true
          schema: { type: string, format: date }
        - in: query
          name: in
          required: true
          schema: { type: string, format: date }
      responses:
        "200":
          description: תוצאות חיפוש בסיסיות
          content:
            application/json:
              schema:
                type: object
                properties: {}

  /search.php:
    get:
      operationId: searchFull
      summary: חיפוש חבילות מלא (כולל טיסות ומלונות)
      parameters:
        - in: query
          name: dest
          required: true
          schema: { type: string }
      responses:
        "200":
          description: תוצאות חיפוש מלאות
          content:
            application/json:
              schema:
                type: object
                properties: {}

  /org_tour.php:
    get:
      operationId: getOrgTour
      summary: קבלת חבילות מאורגנות לפי יעד
      parameters:
        - in: query
          name: dest
          required: true
          schema: { type: string }
        - in: query
          name: month
          required: false
          schema: { type: string }
      responses:
        "200":
          description: רשימת חבילות מאורגנות
          content:
            application/json:
              schema:
                type: object
                properties: {}

  /org_tour_select.php:
    get:
      operationId: getOrgTourSelect
      summary: קבלת פרטי טיול מאורגן מלא כולל מסלול יומי, טיסות ומלון
      parameters:
        - in: query
          name: packId
          required: true
          schema: { type: string }
        - in: query
          name: hotelId
          required: true
          schema: { type: string }
        - in: query
          name: dateFrom
          required: true
          schema: { type: string, format: date }
        - in: query
          name: flights
          required: true
          schema: { type: string }
      responses:
        "200":
          description: פרטי טיול מלא
          content:
            application/json:
              schema:
                type: object
                properties: {}

components:
  schemas:
    Itinerary:
      type: object
      properties:
        id: { type: integer }
        title: { type: string }
        description: { type: string }

    Article:
      type: object
      properties:
        id: { type: integer }
        title: { type: string }
        subtitle: { type: string }
        content: { type: string }
        meta_title: { type: string }
        meta_description: { type: string }
        meta_keywords: { type: string }
        url_slug: { type: string }
        cover_image_path: { type: string }